it-swarm.com.de

Python und regulärer Ausdruck mit Unicode

Ich muss einige Unicode-Symbole aus der Zeichenfolge "بِسِمْ اللَّهَّ الرَّحَّمْنَٰ الرَّحَّيمِ" löschen.

Ich weiß, dass sie hier auf jeden Fall existieren. Ich habe es versucht:

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

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

80
bsn

Verwenden Sie python 2.x oder 3.0?

Wenn Sie 2.x verwenden, versuchen Sie, die Regex-Zeichenfolge mit 'u' zu einer Unicode-Escape-Zeichenfolge zu machen. Da es sich um einen regulären Ausdruck handelt, empfiehlt es sich, den regulären Ausdruck mit 'r' als rohen String zu definieren. 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

Bearbeiten:

Es ist auch empfehlenswert, das Flag re.UNICODE/re.U/(? U) für reguläre Unicode-Ausdrücke zu verwenden, wirkt sich jedoch nur auf Zeichenklassen-Aliase wie\w oder\b aus, von denen dieses Muster keine verwendet und dies auch nicht tun würde betroffen sein von.

105
ʞɔıu

Verwenden Sie nicode Strings. Verwenden Sie das re.UNICODE Flag.

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

Lesen Sie den Artikel von Joel Spolsky mit dem Titel Das absolute Minimum, das jeder Softwareentwickler unbedingt über Unicode und Zeichensätze wissen muss (Keine Ausreden!)

66
nosklo