Поддержка графем в регулярных выражениях 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.
Проблема в том, что по умолчанию строки python2 являются байтовыми строками, что не имеет смысла в графической форме Юникода. Если вы укажете использование юникодных строк, это отлично сработает.
>>> print(regex.match('\X', 'Ä').group(0))
>>> print(regex.match('\X', u'Ä').group(0))
Ä
В python3 строка по умолчанию - Unicode, и для указания байтовой строки вы должны добавить b
как это b"mybytestring"