Python и регулярное выражение с Unicode

Мне нужно удалить некоторые символы Unicode из строки 'بسم الل َّ ه <

> <

Я знаю, что они существуют здесь наверняка. Я пробовал:

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

но это не сработает. Строка остается неизменной. Что я делаю неправильно?

Ответ 1

Используете ли вы python 2.x или 3.0?

Если вы используете 2.x, попробуйте сделать строку регулярных выражений строкой unicode-escape, с 'u'. Поскольку это регулярное выражение, хорошая практика сделать строку регулярных выражений исходной строкой с помощью "r". Кроме того, избыточное размещение всей фигуры в круглых скобках является излишним.

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

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

Edit:

Также хорошо использовать флаг re.UNICODE/re.U/(? u) для регулярных выражений unicode, но он влияет только на алиасы класса символов, такие как \w или\b, из которых этот шаблон не использует и поэтому на него не повлияет.

Ответ 2

Используйте unicode строки. Используйте флаг 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
بسم الله الرحمن الرحيم

Прочитайте статью Джоэла Спольски под названием Абсолютный минимум Каждый разработчик программного обеспечения абсолютно уверен, должен знать о юникодном и символьном наборах (без отговорок!)