Python und regulärer Ausdruck mit Unicode

82

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

Ich weiß, dass sie hier sicher existieren. Ich habe es versucht:

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

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

bsn
quelle

Antworten:

110

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 Regex handelt, empfiehlt es sich, Ihre Regex-Zeichenfolge mit 'r' zu einer Rohzeichenfolge zu machen. Außerdem ist es überflüssig, Ihr gesamtes 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 wird auch empfohlen, das Flag re.UNICODE / re.U / (? U) für Unicode-Regexe zu verwenden. Es betrifft jedoch nur Zeichenklassen-Aliase wie \ w oder \ b, von denen dieses Muster keine verwendet und dies auch nicht tun würde betroffen sein von.

ʞɔıu
quelle
15
Hmm, wusste nicht, dass Sie beide uund rPräfixe verketten können . Das ist ziemlich toll!
Balthazar Rouberol
4
@ BalthazarRouberol Ich bekomme SyntaxError: invalid syntax in Python 3.6
Umair Ayub
73

Verwenden Sie Unicode- Zeichenfolgen. Verwenden Sie das Flag 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
بسم الله الرحمن الرحيم

Lesen Sie den Artikel von Joel Spolsky mit dem Titel " Das absolute Minimum". Jeder Softwareentwickler muss unbedingt über Unicode und Zeichensätze Bescheid wissen (keine Ausreden!).

nosklo
quelle
10
Der Artikel ist fantastisch
Fluffy
@nosklo, warum funktionieren die geschweiften Klammern, die die Anzahl der Zeichen festlegen - {5} - nicht mit Unicode-Zeichen. Ich habe Probleme damit, aber das + funktioniert einwandfrei. Hast du eine Idee? Vielen Dank!
Securecurve
@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 bei Ihnen nicht funktioniert, sollten Sie eine neue Frage stellen und Ihren Code und das Ergebnis angeben, das Sie erhalten.
Nosklo
3
reWenn Sie Python verwenden möchten , müssen Sie wissen, dass es keine Unicode-Zeicheneigenschaft (wie \p{L}) unterstützt. pypi.python.org/pypi/regex tut es.
laut
re.UNICODEFlagge ist nutzlos hier, da es nur eine Abkürzung Charakterklassen betrifft \w, \d, \s.
nhahtdh