Регулярное выражение Python, соответствующее классу символов регионального индикатора
Флаги в смайликах обозначены парой символов региональных индикаторов. Я хотел бы написать регулярное выражение Python для вставки пробелов между строкой флагов Emoji.
Например, эта строка имеет два бразильских флага:
u"\U0001F1E7\U0001F1F7\U0001F1E7\U0001F1F7"
Который будет отображаться так:
Я хотел бы вставить пробелы между любой парой символов региональных индикаторов. Что-то вроде этого:
re.sub(re.compile(u"([\U0001F1E6-\U0001F1FF][\U0001F1E6-\U0001F1FF])"),
r"\1 ",
u"\U0001F1E7\U0001F1F7\U0001F1E7\U0001F1F7")
Что приведет к:
u"\U0001F1E7\U0001F1F7 \U0001F1E7\U0001F1F7 "
Но этот код дает мне ошибку:
sre_constants.error: bad character range
Подсказка (я думаю) о том, что идет не так, заключается в следующем, который показывает, что \U0001F1E7 превращается в два "символа" в регулярном выражении:
re.search(re.compile(u"([\U0001F1E7])"),
u"\U0001F1E7\U0001F1F7\U0001F1E7\U0001F1F7").group(0)
Это приводит к:
u'\ud83c'
К сожалению, мое понимание юникода слишком слабо для меня, чтобы добиться дальнейшего прогресса.
РЕДАКТИРОВАТЬ: я использую Python 2.7.10 на Mac.
1 ответ
Я полагаю, что вы используете Python 2.7 в Windows или Mac, который имеет узкую 16-битную сборку Unicode - Linux/Glibc обычно имеет 32-битный полный Unicode, также Python 3.5 имеет широкий Unicode на всех платформах.
То, что вы видите, это один код, разбитый на суррогатную пару. К сожалению, это также означает, что вы не можете легко использовать один класс символов для этой задачи. Однако это все еще возможно. UTF-16 представление U+1F1E6 () \uD83C\uDDE6
и U+1F1FF () равен \uD83C\uDDFF
,
У меня даже нет доступа к такой сборке Python вообще, но вы можете попробовать
\uD83C[\uDDE6-\uDDFF]
в качестве замены для одного [\U0001F1E6-\U0001F1FF]
Таким образом, все ваше регулярное выражение будет
(\uD83C[\uDDE6-\uDDFF]\uD83C[\uDDE6-\uDDFF])
Причина, по которой класс персонажа не работает, состоит в том, что он пытается создать диапазон от второй половины первой суррогатной пары до первой половины второй суррогатной пары - это не удается, потому что начало диапазона лексикографически больше, чем конец.
Однако это регулярное выражение по-прежнему не будет работать в Linux, вам нужно использовать оригинал, поскольку сборки Linux по умолчанию используют широкий юникод.
Кроме того, обновите ваш Windows Python до версии 3.5 или выше.