Как добиться выравнивания по левому краю в многострочной текстовой строке, если каждая строка разделена пробелом?

#python #regex #formatting

Вопрос:

Как добиться выравнивания по левому краю следующего текста? Заранее спасибо!

 text = """"
nword1 meanings
nword123 measings
nword12345 meanings
"""
 

ожидаемый:

 text = """"
nword1     meanings
nword123   measings
nword12345 meanings
"""
 

Я пытался использовать re.sub, а затем использовать ljust, но это не работает.

 In [58]: print(re.sub('(n[w] s*)', r'1'.ljust(20), text))
"

word1                   meanings

word123                   measings

word12345                   meanings

# or print(re.sub('(n[w] s*)', r'1' ' '*(20-len(r'1')), text))
# the result is same
 

Ответ №1:

Вы можете, например, вычислить длину самого длинного слова с начала строки, а затем добавить другое значение с максимальной длиной после каждого слова в пробелах.

 import re

text = """"
nword1     meanings
nword123         measings
nword12345        meanings
"""

maxLen = len(max(re.findall(r"^S ", text, re.M), key=len))
result = re.sub(r"(S )[^Srn] ", lambda m: m.group(1)   ((maxLen   1) - len(m.group(1))) * " ", text)
print(result)
 

Выход

 word1     meanings

word123   measings

word12345 meanings
 

Демо-версия Python


Другим вариантом может быть использование форматирования строк и динамическая сборка формата строк.

 maxLen = len(max(re.findall(r"^S ", text, re.M), key=len))
result = re.sub(r"(S )[^Srn] ", lambda m: '{{:{}s}}'
                .format(str(maxLen   1))
                .format(m.group(1)),
                text)
print(result)
 

Демо-версия Python

Комментарии:

1. f-строки-это современный метод форматирования.

2. @MikeM Да, вы также можете написать его, конечно, с помощью строк f 🙂

Ответ №2:

Например:

 import re

text = """
word1 meanings
word123 measings
word12345 meanings
"""

def repl(match): return match.group(1).ljust(10)   match.group(2)
text = re.sub(r'^(w )  (w )


Комментарии:

1. Большое спасибо, это тоже очень полезно!

Ответ №3:

Вы можете разделить строку и выровнять первое слово по левому краю, а второе-по правому, как показано ниже.

 print(text.split()[1].ljust(20) text.split()[2].rjust(20))
 

если у вас многострочная строка, вы можете сделать, как показано ниже, сначала получить строки, разделить слова и выровнять их слева и справа, как показано ниже.

 for strings in text.strip().split('n'):
    if len(strings) > 1:
        print(strings.split()[0].ljust(20)   strings.split()[1].rjust(20))
 

Комментарии:

1. Спасибо! Я забыл сказать, что хочу получить окончательный результат, а не просто распечатать его.

2. Да, в таком случае лучше использовать регулярное выражение

, repl, text, flags=re.MULTILINE)
print(text)

Комментарии:

1. Большое спасибо, это тоже очень полезно!

Ответ №3:

Вы можете разделить строку и выровнять первое слово по левому краю, а второе-по правому, как показано ниже.


если у вас многострочная строка, вы можете сделать, как показано ниже, сначала получить строки, разделить слова и выровнять их слева и справа, как показано ниже.


Комментарии:

1. Спасибо! Я забыл сказать, что хочу получить окончательный результат, а не просто распечатать его.

2. Да, в таком случае лучше использовать регулярное выражение