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?
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
This dog ????
This dog
Remarque: emoji_pattern
ne correspond qu’à certains emoji (pas tous). Voir Quels personnages sont Emoji .
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)
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)
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.
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)
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)
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
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
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.
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.