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.
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).
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)
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.)