Вы используете неправильное обозначение для точек юникода, отличных от BMP; вы хотите использовать \U0001FFFF
, заглавную U
и 8 цифр:
myre = re.compile(u'['
u'\U0001F300-\U0001F5FF'
u'\U0001F600-\U0001F64F'
u'\U0001F680-\U0001F6FF'
u'\u2600-\u26FF\u2700-\u27BF]+',
re.UNICODE)
Это можно сократить до:
myre = re.compile(u'['
u'\U0001F300-\U0001F64F'
u'\U0001F680-\U0001F6FF'
u'\u2600-\u26FF\u2700-\u27BF]+',
re.UNICODE)
поскольку ваши первые два диапазона являются смежными.
В вашей версии указывалось (с добавленными пробелами для удобства чтения):
[\u1F30 0-\u1F5F F\u1F60 0-\u1F64 F\u1F68 0-\u1F6F F \u2600-\u26FF\u2700-\u27BF]+
Это потому, что escape-последовательность \uxxxx
всегда занимает только 4 шестнадцатеричных цифры, а не 5.
Самый большой из этих диапазонов — 0-\u1F6F
(то есть от цифры 0
до Ὧ
), который охватывает < em>очень большой диапазон стандарта Unicode.
Исправленное выражение работает, если вы используете исполняемый файл Python для UCS-4:
>>> import re
>>> myre = re.compile(u'['
... u'\U0001F300-\U0001F64F'
... u'\U0001F680-\U0001F6FF'
... u'\u2600-\u26FF\u2700-\u27BF]+',
... re.UNICODE)
>>> myre.sub('', u'Some example text with a sleepy face: \U0001f62a')
u'Some example text with a sleepy face: '
Эквивалент UCS-2:
myre = re.compile(u'('
u'\ud83c[\udf00-\udfff]|'
u'\ud83d[\udc00-\ude4f\ude80-\udeff]|'
u'[\u2600-\u26FF\u2700-\u27BF])+',
re.UNICODE)
Вы можете объединить их в свой скрипт с обработчиком исключений:
try:
# Wide UCS-4 build
myre = re.compile(u'['
u'\U0001F300-\U0001F64F'
u'\U0001F680-\U0001F6FF'
u'\u2600-\u26FF\u2700-\u27BF]+',
re.UNICODE)
except re.error:
# Narrow UCS-2 build
myre = re.compile(u'('
u'\ud83c[\udf00-\udfff]|'
u'\ud83d[\udc00-\ude4f\ude80-\udeff]|'
u'[\u2600-\u26FF\u2700-\u27BF])+',
re.UNICODE)
Конечно, регулярное выражение уже устарело, поскольку оно не распространяется на эмодзи, определенные в более новых версиях Unicode; кажется, что он охватывает эмодзи, определенные до Unicode 8.0 (поскольку U+1F91D HANDSHAKE был добавлен в Unicode 9.0).
Если вам нужно более современное регулярное выражение, возьмите его из пакета, который активно пытается идти в ногу со временем. -дата на эмодзи; он специально поддерживает создание такого регулярного выражения:
import emoji
def remove_emoji(text):
return emoji.get_emoji_regexp().sub(u'', text)
Пакет в настоящее время актуален для Unicode 11.0 и имеет инфраструктуру для быстрого обновления до будущих выпусков. Все, что нужно сделать вашему проекту, — это обновить его, когда появится новая версия.
person
Martijn Pieters
schedule
26.10.2014
u'\u1f300'
должно бытьu'\U0001f300'
. Первый -'\u1f30'
и'0'
. - person Mark Tolonen   schedule 26.10.2014