Deepwalker / trafaret

Ultimate transformation library that supports validation, contexts and aiohttp.
http://trafaret.readthedocs.org/en/latest/
BSD 2-Clause "Simplified" License
177 stars 31 forks source link

URL_RE explain #56

Open lud4ik opened 5 years ago

lud4ik commented 5 years ago
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,
)

1) r'(?:\S+(?::\S)?@)?' # user and password (?::\S)? уже и так ловится \S+ Ещё здесь уместней нежадный квантификатор +?: \S+?@, потому что мы же не ожидаем ещё одного @ в этой подстроке? 2) r'(?:(?:A-Z0-9?.)+(?:[A-Z]{2,6}.?|[A-Z0-9-]{2,}.?)|' # domain... Эта сложность оправдана? По каким кейсам не подходит (?:\w[\w-]+.)+[\w-]+\w.? Минус должен быть в конце группы, я не знаю, что получится из [A-Z0-9-_]

lud4ik commented 5 years ago
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/

конец строки больше для поиска ссылок в тексте

Deepwalker commented 5 years ago

Не знаю что с этим делать. Насколько я вижу \w это как-то чересчур круто. С таким же успехом можно просто типа http://.+ сделать и успокоиться :) Может вот этот вмержить PR? https://github.com/Deepwalker/trafaret/pull/36

Deepwalker commented 5 years ago

Если прям надо серьёзно проверять урлы, в рабочем коде я бы написал трафарет поверх YARN.