На этом шаге мы рассмотрим возможности модуля 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.
На следующем шаге мы рассмотрим удаление нежелательных символов из строк.