сопоставление символов Юникода в регулярных выражениях 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)
,./___,___-=+
(в последнем случае запятая - китайская запятая.)