web-dev-qa-db-fra.com

Python et expression régulière avec Unicode

Je dois supprimer certains symboles Unicode de la chaîne "بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ"

Je sais qu'ils existent ici à coup sûr. J'ai essayé:

re.sub('([\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+)', '', 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ')

mais ça ne marche pas. La chaîne reste la même. Qu'est-ce que je fais mal?

80
bsn

Utilisez-vous python 2.x ou 3.0?

Si vous utilisez 2.x, essayez de faire de la chaîne d'expression régulière une chaîne d'échappement unicode, avec 'u'. Puisqu'il s'agit d'une expression régulière, il est recommandé de faire de votre chaîne d'expression régulière une chaîne brute, avec "r". De plus, mettre votre motif entier entre parenthèses est superflu.

re.sub(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', '', ...)

http://docs.python.org/tutorial/introduction.html#unicode-strings

Modifier:

Il est également recommandé d'utiliser l'indicateur re.UNICODE/re.U/(? U) pour les expressions rationnelles unicode, mais cela n'affecte que les alias de classe de caractères comme\w ou\b, dont ce modèle n'utilise aucun et ne le ferait donc pas. être affecté par.

105
ʞɔıu

Utilisez nicode chaînes. Utilisez l'indicateur re.UNICODE .

>>> myre = re.compile(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', 
                      re.UNICODE)
>>> myre
<_sre.SRE_Pattern object at 0xb20b378>
>>> mystr = u'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ'
>>> result = myre.sub('', mystr)
>>> len(mystr), len(result)
(38, 22)
>>> print result
بسم الله الرحمن الرحيم

Lisez l'article de Joel Spolsky intitulé Le minimum absolu que tous les développeurs de logiciels doivent absolument et positivement connaître à propos de l'Unicode et des jeux de caractères (pas d'excuses!)

66
nosklo