it-swarm.com.de

emojis aus einem String in Python entfernen

Ich habe diesen Code in Python zum Entfernen von Emojis gefunden, funktioniert aber nicht. Kannst du mit anderen Codes helfen oder das beheben? 

Ich habe beobachtet, dass alle Emjois mit \xf beginnen, aber wenn ich versuche, nach str.startswith("\xf") zu suchen, erhalte ich einen ungültigen Zeichenfehler.

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

Hier ist der Fehler:

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

Jedes Element in einer Liste kann ein Word ['This', 'dog', '\xf0\x9f\x98\x82', 'https://t.co/5N86jYipOI'] sein.

UPDATE: Ich habe diesen anderen Code verwendet:

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)

Aber das entfernt die Emojis immer noch nicht und zeigt sie! Irgendein Hinweis, warum das so ist?  enter image description here

17
Mona Jalal

In Python 2 müssen Sie u''-Literal verwenden, um eine Unicode-Zeichenfolge zu erstellen. Sie sollten auch das re.UNICODE-Flag übergeben und Ihre Eingabedaten in Unicode (z. B. text = data.decode('utf-8')) konvertieren:

#!/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

Ausgabe

This dog ????
This dog 

Hinweis: emoji_pattern entspricht nur einigen Emoji (nicht allen). Siehe Welche Zeichen sind Emoji .

30
jfs

Wenn Sie das Beispiel aus der akzeptierten Antwort verwenden und immer noch Fehler mit "schlechtem Zeichenbereich" erhalten, verwenden Sie wahrscheinlich einen schmalen Build ( siehe diese Antwort für weitere Details). Eine neu formatierte Version der Regex scheint zu funktionieren:

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

Komplette Version Entfernen von 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

Akzeptierte Antwort, und andere arbeiteten eine Weile für mich, aber ich entschied mich schließlich, alle Zeichen außerhalb der Grundlegenden Mehrsprachigen Ebene zu entfernen. Dies schließt zukünftige Ergänzungen zu anderen Unicode-Ebenen (in denen Emojis und ähnliches vorkommen) aus, was bedeutet, dass ich meinen Code nicht jedes Mal aktualisieren muss, wenn neue Unicode-Zeichen hinzugefügt werden :).

In Python 2.7 zu Unicode konvertieren, wenn Ihr Text noch nicht vorhanden ist, und dann den negativen regulären Ausdruck unten verwenden (subs anything not = in Regex, das sind alle Zeichen aus BMP außer für Ersatzzeichen, die zum Erstellen von 2-Byte-Zeichen verwendet werden.

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

Da [...] eine beliebige Zeichengruppe bedeutet und zwei durch einen Bindestrich getrennte Zeichen in einer Gruppe einen Zeichenbereich bedeuten (häufig "az" oder "0-9"), sagt Ihr Muster "einen Schrägstrich gefolgt von alle Zeichen in der Gruppe, die x, {, 1, F, 6, 0, 1 enthalten, den Bereich} bis x, {, 1, F, 6, 4, f oder} "gefolgt von einem Schrägstrich und dem Buchstaben u". Dieser Bereich in der Mitte nennt den schlechten Zeichenbereich.

3
Bryan Oakley

das ist meine Lösung. Diese Lösung entfernt zusätzliche Emoji von Mann und Frau, die nicht von Python ???? ???? und ???? rendered gerendert werden können

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

Ich habe versucht, die vollständige Liste der Unicodes zu sammeln ... Ich benutze es, um Emojis aus Tweets zu extrahieren und es funktioniert sehr gut für mich.

# 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

Das funktioniert für mich. Es wird motiviert durch 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

Wenn Sie nicht regex verwenden möchten, ist die beste Lösung das emoji python package .

Hier ist eine einfache Funktion, um Emoji-Freitext zurückzugeben (dank dieser SO Antwort ):

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

Wenn Sie mit Emojis-Strings arbeiten, ist dies unkompliziert

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

Wenn Sie es mit Unicode zu tun haben (wie im Beispiel von @jfs), codieren Sie es einfach mit utf-8.

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

Habe alle Antworten ausprobiert, leider haben sie das neue umarmende Gesicht nicht entfernt. oder die klirrenden Gläser emoji ???? oder ????, ???? und vieles mehr.

Am Ende stand eine Liste aller möglichen Emoji aus dem Python-Emoji-Paket auf Github. Ich musste eine Gist erstellen, da es für Stackoverflow-Antworten ein Limit von 30.000 Zeichen gibt und über 70.000 Zeichen.

Hier ist die Liste

0
octohedron

Hier ist ein Python 3-Skript, das die get_emoji_regexp() der Emoji-Bibliothek verwendet - wie von kingmakerking und Martijn Pieters in ihrer Antwort/ihrem Kommentar vorgeschlagen.

Es liest Text aus einer Datei und schreibt den Emoji-freien Text in eine andere Datei.

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)
0
jeffhale

Das Konvertieren der Zeichenfolge in einen anderen Zeichensatz wie folgt kann hilfreich sein:

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

Mit freundlichen Grüßen.

0
Tobias Ernst