Я бы хотел заменить приведенное ниже регулярное выражение на дружественную к юникоду версию, которая будет перехватывать такие вещи, как http://➡.ws и другие не-ascii IRI . Цель состоит в том, чтобы извлечь их из текста пользователей, кодировать и html-ize их в реальные ссылки.
Python предоставляет флаг re.UNICODE, который меняет значение \ w, но это не очень полезно в этом случае (что я вижу), потому что он определен как "буквенно-цифровые символы и подчеркивание", а не все из моего ниже символа классы включают подчеркивание.
domain_regex = re.compile(r"""
(
(https?://)
(
[0-9a-zA-Z]
[0-9a-zA-Z_-]*
\.
)+
[a-zA-Z]{2,4}
)
| # begins with an http scheme followed by a domain, or
(
(?<! # negative look-behind
[0-9a-zA-Z.@-]
)
(
[0-9a-zA-Z]
[0-9a-zA-Z_-]*
\.
)+
# top-level domain names
com|ca|net|org|edu|gov|biz|info|mobi|name|
us|uk|fr|au|be|ch|de|es|eu|it|tv|cn|jp
)
""", re.VERBOSE)
Другие домены, отличные от ascii: