Python і регулярний вираз з Unicode


83

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

Я знаю, що вони тут існують точно. Я намагався:

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

але це не працює. Рядок залишається незмінним. Що я роблю не так?

Відповіді:


110

Ви використовуєте 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

Редагувати:

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


15
Хм, не знав, що ви можете об’єднати обидва uта rпрефікси. Це досить круто!
Бальтазар Рубероль

6
@BalthazarRouberol Я потрапляю SyntaxError: invalid syntax в Python 3.6
Umair Ayub

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


11
стаття чудова
Пухнастий

@nosklo, чому фігурні дужки, що встановлюють кількість символів - {5} - не працюють з символами Unicode, у мене проблеми з цим, але + працює нормально .. ти маєш ідею? Дякую!
securecurve

@securecurve Я поняття не маю, і без моєї чарівної кришталевої кулі неможливо допомогти. Я просто тестував це, і воно для мене чудово працює. Якщо у вас це не працює, я пропоную вам задати нове запитання, вказавши свій код і результат, який ви отримуєте.
nosklo

4
Якщо ви хочете використовувати reв python, ви повинні знати, що він не підтримує властивість символу Unicode (наприклад \p{L}). pypi.python.org/pypi/regex це робить.
галасливий

re.UNICODEпрапор марно тут, так як це зачіпає тільки скорочені класи символів \w, \d, \s.
nhahtdh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.