Python и регулярное выражение с Unicode - PullRequest
79 голосов
/ 26 декабря 2008

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

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

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

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

Ответы [ 2 ]

104 голосов
/ 26 декабря 2008

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

Если вы используете 2.x, попробуйте сделать строку regex строкой с escape-символом Unicode, используя '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) для регулярных выражений Юникода, но он влияет только на псевдонимы классов символов, такие как \ w или \ b, для которых этот шаблон не использует так не будет затронуто.

65 голосов
/ 26 декабря 2008

Использовать 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 и наборах символов (без оправданий!)

...