web-dev-qa-db-fra.com

correspondance des caractères unicode dans python expressions régulières

J'ai lu les autres questions sur Stackoverflow, mais toujours pas de plus près. Désolé, si cela est déjà répondu, mais je n'ai rien proposé pour fonctionner.

>>> 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'}

Tout va bien, alors j'essaie quelque chose avec des caractères norvégiens (ou quelque chose de plus 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'

Comment puis-je faire correspondre des caractères Unicode typiques, comme øæå? J'aimerais pouvoir également faire correspondre ces caractères, à la fois dans le groupe de balises ci-dessus et dans celui du nom de fichier.

26
Weholt

Vous devez spécifier le re.UNICODE flag, and entrez votre chaîne en tant que chaîne Unicode en utilisant le préfixe 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'}

C'est dans Python 2; dans Python 3 vous devez omettre le u parce que toutes les chaînes sont Unicode).

45
Thomas

Vous avez besoin du drapeau UNICODE :

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

Dans Python 2, vous avez besoin du drapeau re.UNICODE et du constructeur de chaîne nicode

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

(Dans ce dernier cas, la virgule est une virgule chinoise.)

6