Python Unicode Regex - PullRequest
       49

Python Unicode Regex

2 голосов
/ 23 марта 2012

Я бы хотел заменить приведенное ниже регулярное выражение на дружественную к юникоду версию, которая будет перехватывать такие вещи, как 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:

Ответы [ 2 ]

5 голосов
/ 23 марта 2012

Если вы хотите написать «\ w, кроме знака подчеркивания», вы можете сделать это, используя отрицательный класс символов:

[^\W_]
0 голосов
/ 23 марта 2012

Как заметил Бакли, "Регулярное выражение Python, соответствующее свойствам Юникода" представляет некоторые альтернативы использованию регулярного выражения + юникод в Python. Если вам нужно только буквенно-цифровое , буквенно-цифровое + подчеркивание или только буквы , возможно, проще придерживаться предложения Mark Byers ([^\W_], \w и [^\W\d_] соответственно, с активным re.UNICODE; Редактировать: неверный порядок ...).

В противном случае посмотрите, какие классы символов допустимы в качестве части IRI, и либо используйте механизм регулярных выражений, поддерживающий классы символов Unicode, либо - если вам нужно чистое решение на языке Python - я бы предложил код, предоставленный в ответ на этот вопрос (или аналогичное решение).

...