2008-12-26 11 views
68

Ich brauche einige Unicode-Zeichen aus dem String ‚بسم الله الرحمن الرحيم‘Python und regulären Ausdruck mit Unicode

Ich weiß, dass sie existieren sicher hier zu löschen. Ich habe versucht:

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

aber es funktioniert nicht. String bleibt gleich. Was mache ich falsch?

Antwort

87

Verwenden Sie Python 2.x oder 3.0?

Wenn Sie 2.x verwenden, versuchen Sie, die Regex-Zeichenfolge mit 'u' als Unicode-Escape-Zeichenfolge zu definieren. Da es Regex ist, ist es eine gute Übung, die Regex-Zeichenkette mit 'r' zu einer rohen Zeichenkette zu machen. Außerdem ist es überflüssig, das gesamte Muster in Klammern zu setzen.

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

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

Edit:

Es ist auch ratsam, die re.UNICODE/re.U/Flag für Unicode reguläre Ausdrücke zu verwenden, aber es wirkt sich nur auf Zeichenklasse Aliasnamen wie (u?) \ w or \ b, von denen dieses Muster keine verwendet und daher nicht beeinflusst werden würde.

+9

Hmm, genannt wusste nicht, Sie beide '' '' u'' und r'' Präfixe verketten kann. Das ist ziemlich cool! –

58

Verwenden Sie unicode Strings. Verwenden Sie die re.UNICODE Flagge.

>>> 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 
بسم الله الرحمن الرحيم 

den Artikel von Joel Spolsky lesenThe Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

+8

der Artikel ist genial – Fluffy

+0

@nosklo, warum die geschweiften Klammern, die die Anzahl der Zeichen setzt - {5} - arbeiten nicht mit Unicode-Zeichen, ich habe Probleme damit, noch, das + funktioniert gut..do Hast du eine Idee? Vielen Dank! – securecurve

+0

@securecurve Ich habe keine Ahnung, und ohne meine magische Kristallkugel gibt es keine Möglichkeit zu helfen. Ich habe es gerade getestet und es funktioniert gut für mich. Wenn es für Sie nicht funktioniert, schlage ich vor, dass Sie eine neue Frage stellen, die ** Ihren Code ** und das Ergebnis, das Sie erhalten, enthält. – nosklo