#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
Другим вариантом может быть использование форматирования строк и динамическая сборка формата строк.
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)
Комментарии:
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. Да, в таком случае лучше использовать регулярное выражение