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

83

Мне нужно удалить некоторые символы Юникода из строки 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ'

Я точно знаю, что они здесь есть. Я старался:

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

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

BSN
источник

Ответы:

110

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

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

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

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

Редактировать:

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

ʞɔıu
источник
15
Хм, не знал , что можно сцепить как uи rпрефиксы. Это круто!
Balthazar Rouberol
6
@BalthazarRouberol я получаю SyntaxError: invalid syntax в Python 3.6
Умайр Аюб
75

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

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

носкло
источник
@nosklo, почему фигурные скобки, устанавливающие количество символов - {5} - не работают с символами Юникода, у меня проблемы с этим, но + работает нормально .. у вас есть идеи? Благодаря!
securecurve
@securecurve Понятия не имею, и без моего волшебного хрустального шара мне не помочь. Я только что протестировал его, и он у меня отлично работает. Если это не сработает для вас, я предлагаю вам задать новый вопрос, указав свой код и результат, который вы получаете.
nosklo
4
Если вы хотите использовать reв python, вы должны знать, что он не поддерживает свойство символа Unicode (например \p{L}). pypi.python.org/pypi/regex делает.
шумно
re.UNICODEфлаг бесполезно здесь, так как это затрагивает только сокращенные классы символов \w, \d, \s.
nhahtdh 06