2008-12-26 11 views
68

je dois supprimer certains symboles Unicode de la chaîne « بسم الله الرحمن الرحيم »Python et expression régulière avec Unicode

Je sais qu'ils existent ici pour vous. J'ai essayé:

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

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

Répondre

87

Utilisez-vous python 2.x ou 3.0?

Si vous utilisez 2.x, essayez de faire de la chaîne regex une chaîne d'échappement unicode, avec 'u'. Comme c'est regex, il est bon de faire de votre chaîne regex une chaîne brute, avec 'r'. En outre, 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

Edit:

Il est aussi une bonne pratique d'utiliser le drapeau re.UNICODE/re.U/pour regexes unicode, mais il ne touche que des alias de classe de caractères comme (u?) \ w ou \ b, dont ce modèle n'en utilise pas et ne serait donc pas affecté par.

+9

Hmm, ne savais pas que vous pourriez concaténer les deux '' '' u'' et préfixes r''. C'est plutôt cool! –

58

Utilisez les chaînes unicode. Utilisez le drapeau 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 
بسم الله الرحمن الرحيم 

Lire l'article par Joel Spolsky appelé The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

+8

l'article est génial – Fluffy

+0

@nosklo, pourquoi les accolades qui définissent le nombre de caractères - {5} - ne fonctionnent pas avec les caractères Unicode, je rencontre des problèmes, mais, le + fonctionne bien .. tu as une idée? Merci! – securecurve

+0

@securecurve Je n'en ai aucune idée, et sans ma boule de cristal magique, il n'y a aucun moyen d'aider. Je viens de le tester, et ça fonctionne bien pour moi. Si cela ne fonctionne pas pour vous, je vous suggère de poser une nouvelle question, en fournissant ** votre code ** et le résultat que vous obtenez. – nosklo