Что такое предполагаемая семантика для диапазонов символов в регулярных выражениях, если одна или обе конечные точки диапазона находятся вне BMP? Я заметил, что следующий вход ведет себя отличается в Python 2.7 и 3.5:Семантика Python для диапазонов Unicode, включающих астральные плоскости
import re
bool(re.match(u"[\u1000-\U00021111]", "\u1234"))
В моем 2.7 я получаю False
, в 3.5 я получаю True
. Последнее имеет смысл для меня. Первое, возможно, связано с \U00021111
, представленным суррогатной парой \ud844\udd11
, но даже тогда я не понимаю его, так как \u1000-\ud844
должен включать \u1234
просто отлично.
- Это указано где-то?
- Это намеренное поведение?
- Это зависит только от версии Python, а также от флагов времени компиляции относительно UTF-16 и UTF-32?
- Есть ли способ добиться последовательного поведения без различий в различиях?
- Если различия в случае неизбежны, то какие условия являются условиями?
Спасибо! Я чувствую себя глупо, что не заметил этого. Однако основная проблема остается: 'bool (re.match (u" [\ u1000- \ U00021111] ", u" \ ueeee "))' все еще дает разные результаты.Я знаю, что это плохой стиль для редактирования вопроса, как только он был дан ответ, таким образом, что ответ больше не применяется. Вы согласны с тем, что я это сделаю, или я должен опубликовать новый вопрос? – MvG
Пожалуйста, проверьте [эту демонстрационную версию Python 2.7 IDEONE] (https://ideone.com/p9Jsgv). 'print (bool (re.match (u" [\ u1000- \ U00021111] ", u" \ ueeee ")))' печатает 'True'. Ваш Python 2.7 должен быть настроен для ввода Unicode (см. '# - * - coding: utf-8 - * -' pragma). –
@ WiktorStribiżew '#coding: utf8' ничего не делает в этом случае. Он объявляет кодировку самого исходного файла, и в этом источнике нет не-ASCII-символов. –