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
بسم الله الرحمن الرحيم
Прочитайте статью Джоэла Спольски под названием Абсолютный минимум Каждый разработчик программного обеспечения абсолютно уверен, должен знать о юникодном и символьном наборах (без отговорок!)