web-dev-qa-db-fra.com

supprimer les émoticônes d'une chaîne en Python

J'ai trouvé ce code en Python pour supprimer les emojis mais cela ne fonctionne pas. Pouvez-vous aider avec d'autres codes ou résoudre ce problème? 

J'ai observé tous mes emjois qui commencent par \xf, mais lorsque j'essaie de rechercher str.startswith("\xf"), l'erreur de caractère invalide s'affiche.

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

Voici l'erreur:

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

Chacun des éléments d'une liste peut être un Word ['This', 'dog', '\xf0\x9f\x98\x82', 'https://t.co/5N86jYipOI']

UPDATE: J'ai utilisé cet autre code:

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)

Mais cela n'enlève toujours pas les emojis et les montre! Avez-vous la moindre idée de cela?  enter image description here

17
Mona Jalal

Sur Python 2, vous devez utiliser u'' littéral pour créer une chaîne Unicode. En outre, vous devez passer l'indicateur re.UNICODE et convertir vos données d'entrée en Unicode (par exemple, 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

Sortie

This dog ????
This dog 

Remarque: emoji_pattern ne correspond qu’à certains emoji (pas tous). Voir Quels personnages sont Emoji .

30
jfs

Si vous utilisez l'exemple de la réponse acceptée et que vous obtenez toujours des erreurs "plage de caractères incorrecte", vous utilisez probablement une construction étroite ( voir cette réponse pour plus de détails). Une version reformatée de la regex qui semble fonctionner est la suivante:

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)
15
scwagner

Version complète de supprimer les emojis:

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)
9
Ali Tavakoli

Parce que [...] signifie n’importe quel jeu de caractères et que deux caractères d’un groupe séparés par un tiret signifient une plage de caractères (souvent "az" ou "0-9"), votre modèle dit "une barre oblique, suivie de" tout caractère du groupe contenant x, {, 1, F, 6, 0, 1, la plage} à x, {, 1, F, 6, 4, f ou} "suivi d'une barre oblique et de la lettre u". Cette plage au milieu est ce que nous appelons la plage des caractères incorrects.

3
Bryan Oakley

c'est ma solution. Cette solution supprime les emoji supplémentaires pour homme et femme qui ne peuvent pas être rendus par python

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)
3
KT Works

J'ai essayé de collecter la liste complète des Unicodes ..__ Je l'utilise pour extraire des emojis de tweets et cela fonctionne très bien pour moi.

# 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)
2
Chiheb.K

Cela fonctionne pour moi. Il est motivé par https://stackoverflow.com/a/43813727/6579239

import unicodedata
from unidecode import unidecode

def deEmojify(inputString):
     returnString = ""
     for character in inputString:
     try:
         character.encode("ascii")
         returnString += character
     except UnicodeEncodeError:
         returnString += ''
     return returnString
1
Abdul-Razak Adam

Si vous n'aimez pas utiliser regex, la meilleure solution pourrait être d'utiliser le paquet emoji python .

Voici une fonction simple pour renvoyer un texte libre emoji (grâce à cette réponse SO ):

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

Si vous avez affaire à des chaînes contenant des emojis, c'est simple.

>> 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

Si vous traitez avec unicode (comme dans l'exemple avec @jfs), il suffit de l'encoder avec utf-8.

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

Essayé toutes les réponses, malheureusement, ils n'ont pas enlevé le nouvel emoji visage étreignant ???? ou le tintement emoji ???? ou ????, ???? et beaucoup plus.

Nous avons fini avec une liste de tous les emoji possibles, tirés du paquet python emoji sur github, et je devais créer un Gist car il existe une limite de 30k caractères sur les réponses stackoverflow et dépasse 70k caractères.

Voici la liste

0
octohedron

Convertir la chaîne en un autre jeu de caractères comme ceci pourrait aider:

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

Sincères amitiés.

0
Tobias Ernst