Шаг 32.
Python: сборник рецептов.
Строки и текст. Использование символов Unicode в регулярных выражениях

    На этом шаге мы рассмотрим возможности модуля re для решения этой проблемы.

Задача

    Вы используете регулярные выражения для обработки текста, однако беспокоитесь о правильном взаимодействии с символами Unicode.

Решение

    По умолчанию модуль re уже имеет некоторые зачаточные представления о некоторых типах символов Unicode. Например, \d совпадает с любым цифровым символом Unicode:

>>> import re
>>> num = re.compile('\d+')
>>> # ASCII-цифры
>>> num.match('123')
<re.Match object; span=(0, 3), match='123'>
>>> # Арабские цифры
>>> num.match('\u0661\u0662\u0663')
<re.Match object; span=(0, 3), match='١٢٣'>
>>> 

    Если вам нужно включить специфические символы Unicode в шаблоны, вы можете использовать обычные последовательности для экранирования символов Unicode (например, \uFFFF или \UFFFFFFF). Например, вот регулярное выражение, которое найдет совпадения со всеми символами на нескольких разных арабских страницах:

>>> arabic = re.compile('[\u0600-\u06ff\u0750-\u077f\u08a0-\u08ff]+')
>>>

    При выполнении поиска совпадений следует нормализовывать и, по возможности, чистить текст, приводя его к стандартной форме (см. предыдущий шаг). Также нужно знать о некоторых специальных случаях. Например, рассмотрим поведение нечувствительного к регистру поиска совпадений при объединении с приведением к одному регистру:

>>> pat = re.compile('stra\u00dfe', re.IGNORECASE)
>>> s = 'straße'
>>> pat.match(s) # Совпадают
<re.Match object; span=(0, 6), match='straße'>
>>> pat.match(s.upper()) # Не совпадают
>>> s.upper() # Преобразование регистра
'STRASSE'
>>> 


Обсуждение

    Смешивание Unicode и регулярных выражений - отличный способ взорвать себе голову. Если вы собираетесь серьезно в это погрузиться, установите стороннюю библиотеку regex, в которой есть полная поддержка приведения текстов в Unicode к одному регистру, а также множество других интересных возможностей, включая аппроксимирующий поиск совпадений.


https://pypi.python.org/pypi/regex.

    На следующем шаге мы рассмотрим удаление нежелательных символов из строк.




Предыдущий шаг Содержание Следующий шаг