Я написал простой класс, который принимает входной почтовый индекс или почтовый индекс и либо возвращает это значение, либо дополняет его до пяти цифр, если он является полностью числовым и имеет длину менее 5 цифр.
Почему мой код не работает?
import re
class ZipOrPostalCode:
def __init__(self, data):
self.rawData = data
def __repr__(self):
if re.match(r"^\d{1,4}$", self.rawData):
return self.rawData.format("%05d")
else:
return self.rawData
if __name__ == "__main__":
z=ZipOrPostalCode("2345")
print(z)
Я ожидаю, что результат будет 02345. Он выведет 2345.
Запустив его в отладчике, видно, что регулярное выражение не совпало.
Наверное. Я не мог заставить это повториться. Спасибо.
Ваше регулярное выражение работает, это format
, который не работает, потому что вы пытаетесь передать целочисленный формат для строки, а также наоборот, а также со старым синтаксисом %
...
В str.format
строковый объект имеет формат (с использованием синтаксиса стиля {}
), а строки / целые числа / любые объекты для форматирования передаются как параметры.
Заменить (например) на:
if re.match(r"^\d{1,4}$", self.rawData):
return "{:05}".format(int(self.rawData))
без формата вы также можете использовать zfill
для левой панели с нулями (быстрее, поскольку вам не нужно преобразовывать в целое число)
return self.rawData.zfill(5)
и вам, вероятно, даже не нужно проверять количество цифр, просто zfill
независимо от того, что или только если почтовый индекс только цифры:
def __repr__(self):
return self.rawData.zfill(5) if self.rawData.isdigit() else self.rawData
Спасибо, я не знал о zfill ()
он малоизвестен и обычно не очень полезен, поскольку заполняется только нулями. Именно то, что вам нужно, но это особый случай!
У вас есть код format
наоборот.
return "{:05d}".format(int(self.rawData))
Я думаю, вы неправильно использовали отладчик, так как выражение совпадает :) Мне нравится (или Чак Норрис): Я никогда использую отладчики python, я просто смотрю на код, пока он не признается.