Удаление emojis из строки в Python

Я нашел этот код в Python для удаления emojis, но он не работает. Можете ли вы помочь с другими кодами или исправить это?

Я заметил, что все мои emjois начинаются с \xf, но когда я пытаюсь выполнить поиск str.startswith("\xf"), я получаю недопустимую ошибку символа.

emoji_pattern = r'/[x{1F601}-x{1F64F}]/u'
re.sub(emoji_pattern, '', word)

Здесь ошибка:

Traceback (most recent call last):
  File "test.py", line 52, in <module>
    re.sub(emoji_pattern,'',word)
  File "/usr/lib/python2.7/re.py", line 151, in sub
    return _compile(pattern, flags).sub(repl, string, count)
  File "/usr/lib/python2.7/re.py", line 244, in _compile
    raise error, v # invalid expression
sre_constants.error: bad character range

Каждый из элементов в списке может быть словом ['This', 'dog', '\xf0\x9f\x98\x82', 'https://t.co/5N86jYipOI']

UPDATE: Я использовал этот другой код:

emoji_pattern=re.compile(ur" " " [\U0001F600-\U0001F64F] # emoticons \
                                 |\
                                 [\U0001F300-\U0001F5FF] # symbols & pictographs\
                                 |\
                                 [\U0001F680-\U0001F6FF] # transport & map symbols\
                                 |\
                                 [\U0001F1E0-\U0001F1FF] # flags (iOS)\
                          " " ", re.VERBOSE)

emoji_pattern.sub('', word)

Но это все еще не удаляет эмозис и показывает их! Есть ли подсказка, почему? введите описание изображения здесь

Ответ 1

Это работает для меня. Это мотивировано fooobar.com/questions/6561790/...

def deEmojify(inputString):
    return inputString.encode('ascii', 'ignore').decode('ascii')

Ответ 2

На Python 2 вы должны использовать u'' literal для создания строки Unicode. Кроме того, вы должны передать флаг re.UNICODE и преобразовать ваши входные данные в Unicode (например, text = data.decode('utf-8')):

#!/usr/bin/env python
import re

text = u'This dog \U0001f602'
print(text) # with emoji

emoji_pattern = re.compile("["
        u"\U0001F600-\U0001F64F"  # emoticons
        u"\U0001F300-\U0001F5FF"  # symbols & pictographs
        u"\U0001F680-\U0001F6FF"  # transport & map symbols
        u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
                           "]+", flags=re.UNICODE)
print(emoji_pattern.sub(r'', text)) # no emoji

Выход

This dog 😂
This dog 

Примечание: emoji_pattern соответствует только некоторым emoji (не всем). Посмотрите, какие персонажи являются Emoji.

Ответ 3

Если вы используете пример из принятого ответа и все еще получаете ошибки "неправильного диапазона символов", вы, вероятно, используете узкую сборку (см. этот ответ для более подробной информации). Переформатированная версия регулярного выражения, которая, похоже, работает:

emoji_pattern = re.compile(
    u"(\ud83d[\ude00-\ude4f])|"  # emoticons
    u"(\ud83c[\udf00-\uffff])|"  # symbols & pictographs (1 of 2)
    u"(\ud83d[\u0000-\uddff])|"  # symbols & pictographs (2 of 2)
    u"(\ud83d[\ude80-\udeff])|"  # transport & map symbols
    u"(\ud83c[\udde0-\uddff])"  # flags (iOS)
    "+", flags=re.UNICODE)

Ответ 4

Завершить vesrion Удаление emojies:

def remove_emoji(string):
    emoji_pattern = re.compile("["
                           u"\U0001F600-\U0001F64F"  # emoticons
                           u"\U0001F300-\U0001F5FF"  # symbols & pictographs
                           u"\U0001F680-\U0001F6FF"  # transport & map symbols
                           u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
                           u"\U00002702-\U000027B0"
                           u"\U000024C2-\U0001F251"
                           "]+", flags=re.UNICODE)
    return emoji_pattern.sub(r'', string)

Ответ 5

Принятый ответ, и другие немного подействовали на меня, но в итоге я решил лишить всех персонажей за пределами Базовой многоязычной плоскости. Это исключает будущие дополнения к другим плоскостям Юникода (где живут эмодзи и тому подобное), что означает, что мне не нужно обновлять мой код каждый раз, когда добавляются новые символы Юникода :).

В Python 2.7 конвертируйте в юникод, если ваш текст еще не существует, а затем используйте отрицательное регулярное выражение, приведенное ниже (содержит все, что не в регулярном выражении, которое представляет собой все символы из BMP, за исключением суррогатов, которые используются для создания 2-байтовых символов дополнительной многоязычной плоскости).

NON_BMP_RE = re.compile(u"[^\U00000000-\U0000d7ff\U0000e000-\U0000ffff]", flags=re.UNICODE)
NON_BMP_RE.sub(u'', unicode(text, 'utf-8'))

Ответ 6

Если вы не заинтересованы в использовании регулярных выражений, лучшим решением может быть использование пакета Emoji Python.

Вот простая функция для возврата свободного текста смайликов (благодаря такому ответу):

import emoji
def give_emoji_free_text(text):
    allchars = [str for str in text.decode('utf-8')]
    emoji_list = [c for c in allchars if c in emoji.UNICODE_EMOJI]
    clean_text = ' '.join([str for str in text.decode('utf-8').split() if not any(i in str for i in emoji_list)])
    return clean_text

Если вы имеете дело со строками, содержащими смайлики, это просто

>> s1 = "Hi 🤔 How is your 🙈 and 😌. Have a nice weekend 💕👭👙"
>> print s1
Hi 🤔 How is your 🙈 and 😌. Have a nice weekend 💕👭👙
>> print give_emoji_free_text(s1)
Hi How is your and Have a nice weekend

Если вы имеете дело с юникодом (как в примере с @jfs), просто закодируйте его с помощью utf-8.

>> s2 = u'This dog \U0001f602'
>> print s2
This dog 😂
>> print give_emoji_free_text(s2.encode('utf8'))
This dog

Правки

Основываясь на комментарии, это должно быть так же просто, как:

def give_emoji_free_text(text):
    return emoji.get_emoji_regexp().sub(r'', text.decode('utf8'))

Ответ 7

Я попытался собрать полный список юникодов. Я использую его для извлечения смайликов из твитов, и это работает очень хорошо для меня.

# Emojis pattern
emoji_pattern = re.compile("["
                u"\U0001F600-\U0001F64F"  # emoticons
                u"\U0001F300-\U0001F5FF"  # symbols & pictographs
                u"\U0001F680-\U0001F6FF"  # transport & map symbols
                u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
                u"\U00002702-\U000027B0"
                u"\U000024C2-\U0001F251"
                u"\U0001f926-\U0001f937"
                u'\U00010000-\U0010ffff'
                u"\u200d"
                u"\u2640-\u2642"
                u"\u2600-\u2B55"
                u"\u23cf"
                u"\u23e9"
                u"\u231a"
                u"\u3030"
                u"\ufe0f"
    "]+", flags=re.UNICODE)

Ответ 8

Потому что [...] означает любой из набора символов, а потому, что два символа в группе, разделенные тире, означают диапазон символов (часто "az" или "0-9" ), ваш паттерн говорит: косой чертой, за которой следуют любые символы в группе, содержащей x, {, 1, F, 6, 0, 1, диапазон} через x, {, 1, F, 6, 4, f или} ", за которым следует косая черта и буква u". Этот диапазон в середине - это то, что re вызывает неправильный диапазон символов.

Ответ 9

это мое решение. Это решение устраняет дополнительные эмоции для мужчин и женщин, которые не могут быть покорены питоном 🤷♂ и 🤦♀

emoji_pattern = re.compile("["
                       u"\U0001F600-\U0001F64F"  # emoticons
                       u"\U0001F300-\U0001F5FF"  # symbols & pictographs
                       u"\U0001F680-\U0001F6FF"  # transport & map symbols
                       u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
                       u"\U00002702-\U000027B0"
                       u"\U000024C2-\U0001F251"
                       u"\U0001f926-\U0001f937"
                       u"\u200d"
                       u"\u2640-\u2642" 
                       "]+", flags=re.UNICODE)

Ответ 10

Перепробовал все ответы, к сожалению, они не убрали новое смайлик с обнимающимся лицом или чокнутые очки смайликов "или", и многое другое.

Закончился списком всех возможных смайликов, взятых из пакета python emoji на github, и мне пришлось создать гист, потому что существует ограничение в 30 тыс. Символов для ответов stackoverflow и более 70 тыс. Символов.

Ответ 11

Преобразование строки в другой набор символов, подобный этому, может помочь:

text.encode('latin-1', 'ignore').decode('latin-1')

С уважением.

Ответ 12

Вот сценарий Python 3, который использует библиотеку emoji get_emoji_regexp() - как предложено kingmakerking и Martijn Pieters в их ответе/комментарии.

Он читает текст из файла и записывает текст без смайликов в другой файл.

import emoji
import re


def strip_emoji(text):

    print(emoji.emoji_count(text))

    new_text = re.sub(emoji.get_emoji_regexp(), r"", text)

    return new_text


with open("my_file.md", "r") as file:
    old_text = file.read()

no_emoji_text = strip_emoji(old_text)

with open("file.md", "w+") as new_file:
    new_file.write(no_emoji_text)

Ответ 13

Полная версия удаления Emojis
✍ 🌷 📌 👈🏻 🖥

def remove_emojis(data):
    emoj = re.compile("["
        u"\U0001F600-\U0001F64F"  # emoticons
        u"\U0001F300-\U0001F5FF"  # symbols & pictographs
        u"\U0001F680-\U0001F6FF"  # transport & map symbols
        u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
        u"\U00002500-\U00002BEF"  # chinese char
        u"\U00002702-\U000027B0"
        u"\U00002702-\U000027B0"
        u"\U000024C2-\U0001F251"
        u"\U0001f926-\U0001f937"
        u"\U00010000-\U0010ffff"
        u"\u2640-\u2642" 
        u"\u2600-\u2B55"
        u"\u200d"
        u"\u23cf"
        u"\u23e9"
        u"\u231a"
        u"\ufe0f"  # dingbats
        u"\u3030"
                      "]+", re.UNICODE)
    return re.sub(emoj, '', data)