Регулярное выражение 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 или выше.

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