correspondance des caractères Unicode dans les expressions régulières de Python
-
14-11-2019 - |
Question
J'ai lu les autres questions à Stackoverflow, mais toujours pas plus près. Désolé, si cela est toujours répondu, mais je n'ai rien proposé de travailler là-bas.
>>> 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 personnages 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 correspondre aux caractères Unicode typiques, comme Øæå? J'aimerais également correspondre à ces personnages, à la fois dans le groupe de balises ci-dessus et celui du nom de fichier.
La solution
Vous devez spécifier le re.UNICODE
drapeau, et Entrez votre chaîne en tant que chaîne Unicode en utilisant le u
préfixe:
>>> 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'}
Ceci est dans Python 2; Dans Python 3, vous devez laisser de côté le u
Parce que toutes les chaînes sont Unicode.
Autres conseils
Vous avez besoin du Unicode drapeau:
m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/påske/øyfjell.jpg', re.UNICODE)
Dans Python 2, vous avez besoin du re.unicode drapeau et le unicode constructeur de cordes
>>> 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 la virgule chinoise.)