Мне нужно проверить общие URL-адреса с использованием любого протокола (http, https, shttp, ftp, svn, mysql и вещи, о которых я не знаю).
Мой первый проход таков:
\w+://(\w+\.)+[\w+](/[\w]+)(\?[-A-Z0-9+&@#/%=~_|!:,.;]*)?





добавление этого RegEx в качестве ответа вики:
[\w+-]+://([a-zA-Z0-9]+\.)+[[a-zA-Z0-9]+](/[%\w]+)(\?[-A-Z0-9+&@#/%=~_|!:,.;]*)?
вариант 2 (Re CMS)
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
Но это слишком мягко для всего разумного, так что оно сокращено, чтобы сделать его более ограничительным и дифференцировать от других вещей.
proto :// name : pass @ server :port /path ? args
^([^:/?#]+)://(([^/?#@:]+(:[^/?#@:]+)?@)?[^/?#@:]+(:[0-9]+)?)(/[^?#]*)(\?([^#]*))?
Другой вариант - svn + ssh: //. Я не думаю, что \ w будет соответствовать "+".
Согласно RFC2396:
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
ОК, значит, Windows // server / dir / file ЯВЛЯЕТСЯ URL-адресом? вроде сделать файл: //// server / dir / file в FF / IE еще более базарным
это довольно опасное регулярное выражение. Фактически он также захватывает весь текст до и после URL-адреса. Это не подходит для моих целей. Я обязательно проверю это перед использованием.
Я пришел к этому немного с другой стороны. Я хотел имитировать способность gchats соответствовать something.co.uk и связать его. Поэтому я выбрал регулярное выражение, которое ищет . без точки или пробела с обеих сторон, а затем захватывает все вокруг, пока не попадет в пробел. Он соответствует точке в конце URI, но я уберу это позже. Так что это может быть вариант, если вы предпочитаете ложные срабатывания, а не пропуски некоторых потенциалов.
url_re = re.compile(r"""
[^\s] # not whitespace
[a-zA-Z0-9:/\-]+ # the protocol and domain name
\.(?!\.) # A literal '.' not followed by another
[\w\-\./\?=&%~#]+ # country and path components
[^\s] # not whitespace""", re.VERBOSE)
url_re.findall('http://thereisnothing.com/a/path adn some text www.google.com/?=query#%20 https://somewhere.com other-countries.co.nz. ellipsis... is also a great place to buy. But try text-hello.com ftp://something.com')
['http://thereisnothing.com/a/path',
'www.google.com/?=query#%20',
'https://somewhere.com',
'other-countries.co.nz.',
'text-hello.com',
'ftp://something.com']
Это выражение совпадает слишком много (_ не разрешено в доменных именах, IIRC, URL-адрес может останавливаться после имени домена) и недостаточно (можно найти ~ и любой символ% hh в пути).