Я работаю над скриптом, который использует zfill
для добавления ведущих нулей в числа, сопоставленные с регулярным выражением в Python 3.
Вот мой код:
#!/usr/bin/env python
import re
string = "7-8"
pattern = re.compile("^(\d+)-(\d+)$")
replacement = "-{}-{}-".format(
"\\1".zfill(2),
"\\2".zfill(3)
)
result = re.sub(pattern, replacement, string)
print(result)
Результат, который я ожидаю, заключается в том, что первое число будет дополнено двумя символами по ширине, а второе число будет дополнено тремя символами. Например:
-07-008-
Вместо этого я получаю:
-7-08-
Почему существует меньше нуля, чем ожидалось?
Вы zfilling константы, используемые для вашей обратной ссылки, которые уже имеют два символа (\
и int), не оставляя места для дополнительного нуля для первого символа и всего лишь одно место для второго символа.
Вместо этого вы можете передать функцию в качестве замены для re.sub
и сделать zfilling там:
def repl_fn(m):
return f'-{m.group(1).zfill(2)}-{m.group(2).zfill(3)}-'
result = re.sub(pattern, repl_fn, string)
print(result)
# -07-008-
Zfilling теперь выполняется во время замены, а не раньше, как в вашем коде.
7
) без zfill. Я понимаю, что вы говорите о количестве символов обратной ссылки, но если бы это было тем, с чем вы работали, я бы ожидал, что значение отобразится в самой строке обратной ссылки (например,\\1
или\1
) Очевидно, что это не так. Хотя я до сих пор не понял, почему мой код не работает, я ценю, что ваш код работает. Спасибо!"\\2".zfill(3)
вызывается в точке, где выполняется форматирование строки.replacement
уже имеет значение'-\\1-0\\2-'
до достиженияre.sub
.