Мне нужно удалить некоторые символы Юникода из строки 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ'
Я точно знаю, что они здесь есть. Я пытался:
re.sub('([\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+)', '', 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ')
но это не работает. Строка остается прежней. Что я делаю неправильно?






Вы используете 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, из которых этот шаблон не использует ни одного и поэтому не будет быть затронутым.
@BalthazarRouberol Я получаю SyntaxError: invalid syntax в Python 3.6
Используйте строки юникод. Используйте флаг 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 Понятия не имею, и без моего волшебного хрустального шара мне не помочь. Я только что протестировал его, и он у меня отлично работает. Если это не сработает для вас, я предлагаю вам задать новый вопрос, указав ваш код и результат, который вы получаете.
Если вы хотите использовать re в python, вы должны знать, что он не поддерживает свойство символа Unicode (например, \p{L}). pypi.python.org/pypi/regex делает.
Флаг re.UNICODE здесь бесполезен, поскольку он влияет только на классы сокращенных символов \w, \d, \s.
Хм, не знал, что можно объединить префиксы
uиr. Это круто!