сопоставление символов Юникода в регулярных выражениях python

Я прочитал через другие вопросы в 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'}

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

>>> 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 ответов


необходимо указать 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.


вам понадобится UNICODE флаг:

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

в 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)
,./___,___-=+

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