Набор полезных regexp'ов для python
Теги: Python
- Комментариев: 3
- |
- Очередь на модерацию: 0
- |
- Комментировать »
Часто возникает задача проверить строку на соответствие каким-либо правилам. На помощь приходят 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}$')
Часто возникает задача проверить строку на соответствие каким-либо правилам. На помощь приходят 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 будет считаться валидным
Добавить комментарий
Пожалуйста будьте вежливы при общении