Python i wyrażenie regularne z Unicode

83

Muszę usunąć niektóre symbole Unicode z ciągu „بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ”

Wiem, że na pewno tu istnieją. Próbowałem:

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

ale to nie działa. Ciąg pozostaje taki sam. Co ja robię źle?

bsn
źródło

Odpowiedzi:

110

Czy używasz Pythona 2.x lub 3.0?

Jeśli używasz 2.x, spróbuj przekształcić ciąg wyrażenia regularnego w łańcuch znaków ucieczki unicode z „u”. Ponieważ jest to wyrażenie regularne, dobrą praktyką jest uczynienie łańcucha wyrażenia regularnego nieprzetworzonym ciągiem z „r”. Również umieszczanie całego wzoru w nawiasach jest zbędne.

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

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

Edytować:

Dobrą praktyką jest również używanie flagi re.UNICODE / re.U / (? U) dla wyrażeń regularnych Unicode, ale ma to wpływ tylko na aliasy klas znaków, takie jak \ w lub \ b, których ten wzorzec nie używa, więc nie mieć wpływ.

ʞɔıu
źródło
15
Hmm, nie wiedziałem, że możesz łączyć oba ui rprzedrostki. To fajnie!
Balthazar Rouberol
6
@BalthazarRouberol I get SyntaxError: invalid syntax in Python 3.6
Umair Ayub
75

Użyj ciągów znaków Unicode . Użyj flagi 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
بسم الله الرحمن الرحيم

Przeczytaj artykuł Joela Spolsky'ego zatytułowany Absolutne minimum Każdy programista Absolutnie, pozytywnie musi wiedzieć o Unicode i zestawach znaków (bez wymówek!)

nosklo
źródło
@nosklo, dlaczego nawiasy klamrowe, które ustawiają liczbę znaków - {5} - nie działają ze znakami Unicode, mam z tym problemy, ale + działa dobrze… czy masz jakiś pomysł? Dzięki!
securecurve
@securecurve Nie mam pojęcia, a bez mojej magicznej kryształowej kuli nie ma sposobu, aby pomóc. Właśnie to przetestowałem i dla mnie działa dobrze. Jeśli to nie zadziała, proponuję zadać nowe pytanie, podając swój kod i otrzymany wynik.
nosklo
4
Jeśli chcesz używać rew Pythonie, musisz wiedzieć, że nie obsługuje on właściwości znaków Unicode (takich jak \p{L}). pypi.python.org/pypi/regex robi.
głośny
re.UNICODEflaga jest tu bezużyteczne, ponieważ wpływa jedynie skrótowym klas postaci \w, \d, \s.
nhahtdh