Betrachten Sie die folgende Liste:
a_list = ['???? ???? me así, bla es se ???? ds ????????????']
Wie kann ich alle Emojis in a_list
in einer neuen Liste extrahieren ?:
new_lis = ['???? ???? ???? ???? ???? ????']
Ich habe versucht, Regex zu verwenden, aber ich habe nicht alle möglichen Emojis-Kodierungen.
Sie können die Bibliothek emoji
verwenden. Sie können prüfen, ob ein einzelner Codepoint ein Emoji-Codepoint ist, indem Sie prüfen, ob er in emoji.UNICODE_EMOJI
enthalten ist.
import emoji
def extract_emojis(str):
return ''.join(c for c in str if c in emoji.UNICODE_EMOJI)
Wenn Sie keine externe Bibliothek verwenden möchten, können Sie als Pythonic-Methode einfach reguläre Ausdrücke und re.findall()
mit einer richtigen Regex verwenden, um die Emojies zu finden:
In [74]: import re
In [75]: re.findall(r'[^\w\s,]', a_list[0])
Out[75]: ['????', '????', '????', '????', '????', '????']
Der reguläre Ausdruck r'[^\w\s,]'
ist eine negierte Zeichenklasse, die mit jedem Zeichen übereinstimmt, das kein Word-Zeichen, Leerzeichen oder Komma ist.
Wie ich bereits in einem Kommentar erwähnte, enthält ein Text im Allgemeinen Word-Zeichen und Interpunktionszeichen, mit denen sich dieser Ansatz leicht umgehen lässt. In anderen Fällen können Sie sie einfach manuell zur Zeichenklasse hinzufügen. Da Sie einen Zeichenbereich in der Zeichenklasse angeben können, können Sie ihn sogar kürzer und flexibler machen.
Eine andere Lösung ist anstelle einer negierten Zeichenklasse, die ausschließt, dass die Nicht-Emoji-Zeichen eine Zeichenklasse verwenden, die Emojies akzeptiert ([]
ohne ^
). Da es viele Emojis mit unterschiedlichen Unicode-Werten gibt, müssen Sie nur die Bereiche zur Zeichenklasse hinzufügen. Wenn Sie mehr Emojies abgleichen möchten, finden Sie hier eine gute Referenz. Sie enthält alle Standard-Emojies mit dem jeweiligen Bereich für verschiedene Emojies http://apps.timwhitlock.info/emoji/tables/unicode :
Ich denke, es ist wichtig darauf hinzuweisen, dass die vorherigen Antworten nicht mit Emojis funktionieren, wie zB ???? ???? ???? ???? , weil es aus 4 Emojis besteht, und mit ... in emoji.UNICODE_EMOJI
werden 4 verschiedene Emojis zurückgegeben. Gleiches gilt für Emojis mit Hautfarbe wie ????????.
Meine Lösung enthält die Module emoji
und regex
. Das Regex-Modul unterstützt das Erkennen von Graphem-Clustern (Sequenzen von Unicode-Codepunkten, die als einzelnes Zeichen dargestellt werden), sodass wir Emojis wie ???? ???? ???? ????
import emoji
import regex
def split_count(text):
emoji_list = []
data = regex.findall(r'\X', text)
for Word in data:
if any(char in emoji.UNICODE_EMOJI for char in Word):
emoji_list.append(Word)
return emoji_list
Testen (mit mehr Emojis mit Hautfarbe):
line = ["???? ???? me así, se ???? ds ???????????? hello ???????????? emoji hello ???????????????? how are ???? you today????????????????"]
counter = split_count(line[0])
print(' '.join(emoji for emoji in counter))
ausgabe:
???? ???? ???? ???? ???? ???? ???????????? ???????????????? ???? ???????? ????????
Bearbeiten:
Wenn Sie Flags einfügen möchten, z. B. ???????? der Unicode-Bereich wäre von ???? bis ???? , so füge hinzu:
flags = regex.findall(u'[\U0001F1E6-\U0001F1FF]', text)
auf die Funktion oben und return emoji_list + flags
.
In diesem Beitrag finden Sie weitere Informationen zu den Flaggen.
Die am besten bewertete Antwort funktioniert nicht immer. Beispielsweise werden Flag-Emojis nicht gefunden. Betrachten Sie die Zeichenfolge:
s = u'Hello \U0001f1f7\U0001f1fa hello'
Was würde besser funktionieren
import emoji
emojis_list = map(lambda x: ''.join(x.split()), emoji.UNICODE_EMOJI.keys())
r = re.compile('|'.join(re.escape(p) for p in emojis_list))
print(' '.join(r.findall(s)))
Schritt 1: Stellen Sie sicher, dass Ihr Text auf utf-8 decodiert wird.text.decode('utf-8')
Schritt 2: Suchen Sie alle Emoji aus Ihrem Text. Sie müssen den Text zeichenweise trennen.[str for str in decode]
Schritt 3: Speichert alle Emoji in einer Liste[c for c in allchars if c in emoji.UNICODE_EMOJI]
Vollständiges Beispiel unten:
>>> import emoji
>>> text = "???? ???? me así, bla es se ???? ds ????????????"
>>> decode = text.decode('utf-8')
>>> allchars = [str for str in decode]
>>> list = [c for c in allchars if c in emoji.UNICODE_EMOJI]
>>> print list
[u'\U0001f914', u'\U0001f648', u'\U0001f60c', u'\U0001f495', u'\U0001f46d', u'\U0001f459']
wenn Sie aus Text entfernen möchten
>>> filtred = [str for str in decode.split() if not any(i in str for i in list)]
>>> clean_text = ' '.join(filtred)
>>> print clean_text
me así, bla es se ds
from emoji import *
EMOJI_SET = set()
# populate EMOJI_DICT
def pop_emoji_dict():
for emoji in UNICODE_EMOJI:
EMOJI_SET.add(emoji)
# check if emoji
def is_emoji(s):
for letter in s:
if letter in EMOJI_SET:
return True
return False
Dies ist eine bessere Lösung, wenn Sie mit großen Datensätzen arbeiten, da Sie nicht jedes Mal alle Emojis durchlaufen müssen. Fand das, um bessere Ergebnisse zu erzielen :)
Die Lösung, um genau das zu bekommen, was Tumbleweed verlangt, ist eine Mischung aus der Antwort mit der höchsten Bewertung und der Antwort des Benutzers594836. Dies ist der Code, der in Python 3.6 für mich funktioniert.
import emoji
import re
test_list=['???? ???? me así,bla es,se ???? ds ????????????']
## Create the function to extract the emojis
def extract_emojis(a_list):
emojis_list = map(lambda x: ''.join(x.split()), emoji.UNICODE_EMOJI.keys())
r = re.compile('|'.join(re.escape(p) for p in emojis_list))
aux=[' '.join(r.findall(s)) for s in a_list]
return(aux)
## Execute the function
extract_emojis(test_list)
## the output
['???? ???? ???? ???? ???? ????']
Ok - Ich hatte das gleiche Problem und ich habe eine Lösung gefunden, bei der Sie keine Bibliotheken (wie Emoji oder Re) importieren müssen, sondern nur eine einzige Codezeile. Es werden alle Emojis in der Zeichenfolge zurückgegeben:
def extract_emojis(sentence):
return [Word for Word in sentence.split() if str(Word.encode('unicode-escape'))[2] == '\\' ]
Dies ermöglichte es mir, eine leichte Lösung zu schaffen, und ich hoffe, es hilft Ihnen allen. Eigentlich - ich brauchte einen, der alle Emojis in einer Zeichenfolge herausfiltern würde - und das ist derselbe wie der obige Code, aber mit einer kleinen Änderung:
def filter_emojis(sentence):
return [Word for Word in sentence.split() if str(Word.encode('unicode-escape'))[2] != '\\' ]
Hier ist ein Beispiel davon in Aktion:
Diese Funktion erwartet eine Zeichenfolge, sodass die Liste der Eingaben in Zeichenfolge konvertiert wird
a_list = '???? ???? me así, bla es se ???? ds ????????????'
# Import the necessary modules
from nltk.tokenize import regexp_tokenize
# Tokenize and print only emoji
emoji = "['\U0001F300-\U0001F5FF'|'\U0001F600-\U0001F64F'|'\U0001F680-
\U0001F6FF'|'\u2600-\u26FF\u2700-\u27BF']"
print(regexp_tokenize(a_list, emoji))
output :['????', '????', '????', '????', '????']