сопоставление символов Юникода в регулярных выражениях Python - PullRequest
26 голосов
/ 17 февраля 2011

Я прочитал другие вопросы в Stackoverflow, но все же не ближе. Извините, если на этот вопрос уже ответили, но я не получил ничего предложенного там для работы.

>>> import re
>>> m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/xmas/xmas1.jpg')
>>> print m.groupdict()
{'tag': 'xmas', 'filename': 'xmas1.jpg'}

Все хорошо, тогда я пробую что-то с норвежскими символами (или что-то более похожее на юникод):

>>> m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/påske/øyfjell.jpg')
>>> print m.groupdict()
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groupdict'

Как мне сопоставить типичные символы Юникода, такие как øæå? Я также хотел бы иметь возможность сопоставлять эти символы как в вышеупомянутой группе тегов, так и в группе имени файла.

Ответы [ 3 ]

45 голосов
/ 17 февраля 2011

Вам необходимо указать флаг re.UNICODE, и ввести вашу строку в виде строки Unicode, используя префикс u:

>>> re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', u'/by_tag/påske/øyfjell.jpg', re.UNICODE).groupdict()
{'tag': u'p\xe5ske', 'filename': u'\xf8yfjell.jpg'}

Это в Python 2; в Python 3 вы должны пропустить u, потому что все строки в Unicode.

11 голосов
/ 17 февраля 2011

Вам нужен флаг UNICODE :

m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/påske/øyfjell.jpg', re.UNICODE)
6 голосов
/ 25 октября 2012

В Python 2 вам нужен флаг re.UNICODE и строковый конструктор unicode

>>> re.sub(r"[\w]+","___",unicode(",./hello-=+","utf-8"),flags=re.UNICODE)
u',./___-=+'
>>> re.sub(r"[\w]+","___",unicode(",./cześć-=+","utf-8"),flags=re.UNICODE)
u',./___-=+'
>>> re.sub(r"[\w]+","___",unicode(",./привет-=+","utf-8"),flags=re.UNICODE)
u',./___-=+'
>>> re.sub(r"[\w]+","___",unicode(",./你好-=+","utf-8"),flags=re.UNICODE)
u',./___-=+'
>>> re.sub(r"[\w]+","___",unicode(",./你好,世界-=+","utf-8"),flags=re.UNICODE)
u',./___\uff0c___-=+'
>>> print re.sub(r"[\w]+","___",unicode(",./你好,世界-=+","utf-8"),flags=re.UNICODE)
,./___,___-=+

(В последнем случае запятая - это китайская запятая.)

...