Регулярное выражение URL Грубера в Python
Вопрос
Как мне переписать это новый способ распознавания адреса для работы на Python?
\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
Решение
В оригинальный источник в этом говорится, что "Этот шаблон должен работать в большинстве современных реализаций регулярных выражений" и, в частности, в Perl.Реализация регулярных выражений в Python является современной и похоже на Perl's но отсутствует тот [:punct:]
класс персонажа.Вы можете легко создать это, используя это:
>>> import string, re
>>> pat = r'\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^%s\s]|/)))'
>>> pat = pat % re.sub(r'([-\\\]])', r'\\\1', string.punctuation)
В re.sub()
вызов экранирует определенные символы внутри набора символов по мере необходимости.
Редактировать:Использование re.escape() работает так же хорошо, поскольку оно просто вставляет обратную косую черту перед все.Сначала это показалось мне грубым, но, безусловно, отлично подходит для данного случая.
>>> pat = pat % re.escape(string.punctuation)
Другие советы
Я не думаю, что в python есть это выражение
[:punct:]
Википедия говорит [:punct:]
это то же самое, что и
[-!\"#$%&\'()*+,./:;<=>?@\\[\\\\]^_`{|}~]
Python не имеет Выражения в скобках POSIX.
В [:punct:]
выражение в скобках эквивалентно в ASCII
[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]