Python zfill от одного в регулярном выражении

1

Я работаю над скриптом, который использует 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-

Почему существует меньше нуля, чем ожидалось?

Теги:
python-3.x

1 ответ

2
Лучший ответ

Вы 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 теперь выполняется во время замены, а не раньше, как в вашем коде.

  • 0
    Ага. Это понял. Я не очень понимаю, почему я получал значение из обратной ссылки (например, 7 ) без zfill. Я понимаю, что вы говорите о количестве символов обратной ссылки, но если бы это было тем, с чем вы работали, я бы ожидал, что значение отобразится в самой строке обратной ссылки (например, \\1 или \1 ) Очевидно, что это не так. Хотя я до сих пор не понял, почему мой код не работает, я ценю, что ваш код работает. Спасибо!
  • 1
    @ AlanW.Smith "\\2".zfill(3) вызывается в точке, где выполняется форматирование строки. replacement уже имеет значение '-\\1-0\\2-' до достижения re.sub .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню