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

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

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

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
84
0
92 613
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы используете 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 и r. Это круто!

Balthazar Rouberol 12.03.2013 13:16

@BalthazarRouberol Я получаю SyntaxError: invalid syntax в Python 3.6

Umair Ayub 20.06.2018 14:28

Используйте строки юникод. Используйте флаг 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 10.02.2013 15:02

@securecurve Понятия не имею, и без моего волшебного хрустального шара мне не помочь. Я только что протестировал его, и он у меня отлично работает. Если это не сработает для вас, я предлагаю вам задать новый вопрос, указав ваш код и результат, который вы получаете.

nosklo 20.02.2013 18:45

Если вы хотите использовать re в python, вы должны знать, что он не поддерживает свойство символа Unicode (например, \p{L}). pypi.python.org/pypi/regex делает.

noisy 01.06.2013 17:07

Флаг re.UNICODE здесь бесполезен, поскольку он влияет только на классы сокращенных символов \w, \d, \s.

nhahtdh 06.10.2015 10:59

Другие вопросы по теме