Поддержка графем в регулярных выражениях Python

Я использую удивительный модуль регулярных выражений, пытаясь его \X поддержка графемы.

Во-первых, я пытаюсь с простой старой .

>>> print regex.match('.', 'Ä').group(0)

>>> print regex.match('..', 'Ä').group(0)
Ä

Все прошло как ожидалось. Перейти к \X

>>> print regex.match('\X', 'Ä').group(0)

>>> print regex.match('\X\X', 'Ä').group(0)
Ä

Почему это так же, как .? Не должен один \X хватит, чтобы захватить амулета? Это:

  • Мое понимание графемы или значение \X неправильно?
  • Какой-нибудь флаг / переключатель мне нужно включить первым? (Я искал документацию, не мог найти)
  • Что-то с моим окружением? (Python 2.7.3, регулярные выражения отчетов пипсов ==2014.12.24)
  • Ошибка в библиотеке?
  • Что-то другое?

2 ответа

Решение

Это работает путем определения Ä как символ юникода.

>>> print regex.match('.', u'Ä').group()
Ä
>>> print regex.match('\X', u'Ä').group()
Ä

Основное различие между Python 2 и Python 3 заключается в основных типах, которые существуют для работы с текстами и байтами. На Python 3 у нас есть один тип текста: str который содержит данные Unicode и два байта типа байтов и байтового массива.

С другой стороны, в Python 2 у нас есть два типа текста: str который для всех намерений и целей ограничен ASCII + некоторые неопределенные данные выше 7-битного диапазона, Unicode, который эквивалентен типу Python 3 str и одному байтовому массиву байтового типа, который он унаследовал от Python 3.

Ссылка - https://docs.python.org/2/howto/unicode.html

Проблема в том, что по умолчанию строки python2 являются байтовыми строками, что не имеет смысла в графической форме Юникода. Если вы укажете использование юникодных строк, это отлично сработает.

>>> print(regex.match('\X', 'Ä').group(0))

>>> print(regex.match('\X', u'Ä').group(0))
Ä

В python3 строка по умолчанию - Unicode, и для указания байтовой строки вы должны добавить b как это b"mybytestring"

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