J'ai une chaîne UTF8 avec combinaison de signes diacritiques. Je veux faire correspondre avec la séquence regex \w
. Il correspond aux caractères qui ont des accents, mais pas s'il y a un caractère latin avec des signes diacritiques.Python regex w ne correspond pas à la combinaison de signes diacritiques?
>>> re.match("a\w\w\wz", u"aoooz", re.UNICODE)
<_sre.SRE_Match object at 0xb7788f38>
>>> print u"ao\u00F3oz"
aoóoz
>>> re.match("a\w\w\wz", u"ao\u00F3oz", re.UNICODE)
<_sre.SRE_Match object at 0xb7788f38>
>>> re.match("a\w\w\wz", u"aoo\u0301oz", re.UNICODE)
>>> print u"aoo\u0301oz"
aóooz
(On dirait que le processer SO démarquage est d'avoir des problèmes avec les caractères combinatoires dans ce qui précède, mais il y a une sur la dernière ligne)
Y at-il de toute façon à correspondre avec des diacritiques combinant \w
? Je ne veux pas normaliser le texte parce que ce texte vient du nom de fichier, et je ne veux pas encore avoir à faire une 'normalisation du nom de fichier unicode'. C'est Python 2.5.
Oui, cela me dira si j'ai un match, mais après avoir fait le match, je sors les groupes correspondants et ensuite je fais des trucs avec eux. Si j'ai utilisé votre approche, alors les octets que j'ai après ne seraient pas les mêmes octets que dans le nom de fichier – Rory
je vois. Savez-vous si les cordes sont cohérentes dans leur utilisation de la combinaison des signes diacritiques (combinant toujours, ou au moins toujours en combinant ou non dans une seule chaîne)? Si tel est le cas, vous pouvez normaliser les résultats à NFC ou NFD à nouveau si nécessaire. Sinon, je pense que vous devrez recourir à des astuces pour détecter la position de la combinaison de signes diacritiques dans la chaîne d'origine et essayer d'utiliser cette information pour décomposer uniquement les caractères nécessaires (ce qui serait bien plus pas du tout). – Steven
Ou peut-être simplement changer l'expression et utiliser les plages pour les diacritiques de combinaison qui vous intéressent, et utiliser quelque chose comme \ w [\ u0300- \ u036F]? au lieu de simplement \ w – Steven