удалить unicode emoji с помощью re в python

Я попытался удалить emoji из текста твита unicode и распечатать результат в python 2.7 с помощью

myre = re.compile(u'[u1F300-u1F5FFu1F600-u1F64Fu1F680-u1F6FFu2600-u26FFu2700-u27BF]+',re.UNICODE)
print myre.sub('', text)

но кажется, что почти все символы удалены из текста. Я проверил несколько ответов из других сообщений, к сожалению, ни один из них не работает здесь. Я сделал что-то не так в огне.compile ()?

вот пример вывода, что все символы были удалены:

“   '   //./” ! # # # …

1 ответов


вы не используете правильную нотацию для точек unicode, отличных от BMP; вы хотите использовать \U0001FFFF, a капитал 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]+

вот так \uxxxx escape-последовательность всегда принимает только 4 шестнадцатеричные цифры, а не 5.

в самый большой из этих диапазонов -0-\u1F6F (так из цифры 0 до ), которая охватывает очень большая полоса стандарта 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)