Почему это регулярное выражение Python не работает?

Я написал простой класс, который принимает входной почтовый индекс или почтовый индекс и либо возвращает это значение, либо дополняет его до пяти цифр, если он является полностью числовым и имеет длину менее 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.

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

Я думаю, вы неправильно использовали отладчик, так как выражение совпадает :) Мне нравится (или Чак Норрис): Я никогда использую отладчики python, я просто смотрю на код, пока он не признается.

Jean-François Fabre 01.05.2018 18:55

Наверное. Я не мог заставить это повториться. Спасибо.

Steve Cohen 01.05.2018 19:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
78
2

Ответы 2

Ваше регулярное выражение работает, это 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 ()

Steve Cohen 01.05.2018 18:53

он малоизвестен и обычно не очень полезен, поскольку заполняется только нулями. Именно то, что вам нужно, но это особый случай!

Jean-François Fabre 01.05.2018 18:54

У вас есть код format наоборот.

return "{:05d}".format(int(self.rawData))

Другие вопросы по теме