Персональный сайт Александра Литовченко

номер32
Поиграть в преферанс в онлайне

Набор полезных regexp'ов для python

Часто возникает задача проверить строку на соответствие каким-либо правилам. На помощь приходят regexp-ы. Осмысленные и беспощадные. Проблема заключается в том, что написание сложных regexp-ов, как правило выливается либо в длительную и нетривиальную отладку, либо в поиски готовых шаблонов в сети (без гарантии правильности), либо в мучительные воспоминания на предмет «вот в каком-то проекте, когда-то делал почти то же самое, вот только в каком именно?».

Так почему бы не собрать используемые паттерны в одном месте? Примеры буду все писать в этот пост, постепенно его наращивая. Код для python.re, но они практически на всех платформах одинаковы.

Определение валидности e-mail

Набившая всем оскомину задача. Есть мнение, что правильный regexp, понимающий точку в имени пользователя, должен выглядеть так:

re.compile(
    r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"
    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"'
    r')@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$'
, re.IGNORECASE)

Определение валидности http url

Здесь присутствуют проверки на протокол (http/https), допуск localhost в качестве домена, возможность указания ip адреса вместо домена, а также опциональный порт сервиса

url_re = re.compile(
    r'^https?://'
    r'(?:(?:[A-Z0-9-]+\.)+[A-Z]{2,6}|'
    r'localhost|'
    r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
    r'(?::\d+)?'
    r'(?:/?|/\S+)$', 
re.IGNORECASE)

Определение валидности IP4

Проcтое решение «в лоб», проверяющее не только цифры но и выход за пределы допустимых диапазонов

ip4_re = re.compile(r'^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$')

Комментарии

1 5 октября 2009 21:46, Oleg

Спасибо. Полезная информация.

2 24 августа 2010 22:10, newpythoncoder

Клево, похоже на регулярные выражения Perl

3 9 сентября 2011 15:43, Евген

Не совсем верно для IP4:
Адрес 001.0.0.1 будет считаться валидным

Добавить комментарий

только текст. HTML теги вырезаются:

Пожалуйста будьте вежливы при общении