trafaret
trafaret copied to clipboard
URL_RE explain
URL_REGEXP = re.compile(
r'^(?:http|ftp)s?://' # http:// or https://
r'(?:\S+(?::\S*)?@)?' # user and password
r'(?:(?:[A-Z0-9](?:[A-Z0-9-_]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' # domain...
r'localhost|' # localhost...
r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
r'(?::\d+)?' # optional port
r'(?:/?|[/?]\S+)$',
re.IGNORECASE,
)
- r'(?:\S+(?::\S*)?@)?' # user and password (?::\S*)? уже и так ловится \S+ Ещё здесь уместней нежадный квантификатор +?: \S+?@, потому что мы же не ожидаем ещё одного @ в этой подстроке?
- r'(?:(?:A-Z0-9?.)+(?:[A-Z]{2,6}.?|[A-Z0-9-]{2,}.?)|' # domain... Эта сложность оправдана? По каким кейсам не подходит (?:\w[\w-]+.)+[\w-]+\w.? Минус должен быть в конце группы, я не знаю, что получится из [A-Z0-9-_]
URL_RE = re.compile(
r'(?:http|ftp)s?://' # http:// or https://
r'(?:\S+?@)?' # user and password
r'(?:(?:\w[\w-]{,62}\.)+(?:\w[\w-]{,62}\.?)|' # domain...
r'localhost|' # localhost...
r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
r'(?::\d+)?' # optional port
r'(?:/?|[/?]\S+)'
r'(?=\s|$)',
re.IGNORECASE|re.UNICODE,
)
у меня получился такой вариант, домен может быть с юникодными символами и браузер правильно редиректит к примеру https://сота.укр -> https://xn--80a1aif.xn--j1amh/
конец строки больше для поиска ссылок в тексте
Не знаю что с этим делать. Насколько я вижу \w это как-то чересчур круто. С таким же успехом можно просто типа http://.+ сделать и успокоиться :)
Может вот этот вмержить PR? https://github.com/Deepwalker/trafaret/pull/36
Если прям надо серьёзно проверять урлы, в рабочем коде я бы написал трафарет поверх YARN.