¿Cómo extraer todos los emojis del texto?

Considere la siguiente lista:

a_list = ['🤔 🙈 me así, bla es se 😌 ds 💕👭👙'] 

¿Cómo puedo extraer en una nueva lista todos los emojis dentro de a_list ?

 new_lis = ['🤔 🙈 😌 💕 👭 👙'] 

Intenté usar expresiones regulares, pero no tengo todas las codificaciones de emojis posibles.

Puedes usar la librería emoji . Puede verificar si un solo punto de código es un punto de código emoji verificando si está contenido en emoji.UNICODE_EMOJI .

 import emoji def extract_emojis(str): return ''.join(c for c in str if c in emoji.UNICODE_EMOJI) 

Creo que es importante señalar que las respuestas anteriores no funcionarán con emojis como 👨‍👩‍👦‍👦, porque consta de 4 emojis, y usar ... in emoji.UNICODE_EMOJI devolverá 4 emojis diferentes. Lo mismo para los emojis con color de piel como.

Mi solución incluye los módulos emoji y regex . El módulo regex admite el reconocimiento de clústeres de grafemas (secuencias de puntos de código Unicode representados como un solo carácter), por lo que podemos contar emojis como 👨‍👩‍👦‍👦

 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 

Pruebas (con más emojis con color de piel):

 line = ["🤔 🙈 me así, se 😌 ds 💕👭👙 hello 👩🏾‍🎓 emoji hello 👨‍👩‍👦‍👦 how are 😊 you today🙅🏽🙅🏽"] counter = split_count(line[0]) print(' '.join(emoji for emoji in counter)) 

salida:

 🤔 🙈 😌 💕 👭 👙 👩🏾‍🎓 👨‍👩‍👦‍👦 😊 🙅🏽 🙅🏽 

Editar:

Si desea incluir banderas, como 🇵🇰 el rango Unicode sería de 🇦 a 🇿 , agregue:

 flags = regex.findall(u'[\U0001F1E6-\U0001F1FF]', text) 

a la función anterior, y return emoji_list + flags .

Vea esta publicación para más información sobre las banderas.

Si no quieres usar una biblioteca externa, como una forma en Pythonic puedes simplemente usar expresiones regulares y re.findall() con una expresión regular adecuada para encontrar los emojies:

 In [74]: import re In [75]: re.findall(r'[^\w\s,]', a_list[0]) Out[75]: ['🤔', '🙈', '😌', '💕', '👭', '👙'] 

La expresión regular r'[^\w\s,]' es una clase de caracteres negados que coincide con cualquier carácter que no sea un carácter de palabra, espacio en blanco o coma.

Como mencioné en el comentario, un texto generalmente contiene caracteres de palabras y puntuación que se abordarán fácilmente con este enfoque, para otros casos, simplemente puede agregarlos manualmente a la clase de caracteres. Tenga en cuenta que dado que puede especificar un rango de caracteres en la clase de caracteres, incluso puede hacerlo más corto y más flexible.

Otra solución es, en lugar de una clase de caracteres negados que excluye a los personajes que no son emoji, use una clase de caracteres que acepte emojies ( [] sin ^ ). Ya que hay muchos emojis con diferentes valores de Unicode , solo necesitas agregar los rangos a la clase de caracteres. Si desea hacer coincidir más emojies, aquí hay una buena referencia que contiene todos los emojies estándar con el rango respectivo para diferentes emojies http://apps.timwhitlock.info/emoji/tables/unicode :

La respuesta mejor calificada no siempre funciona. Por ejemplo, no se encontrarán emojis de bandera. Considere la cadena:

 s = u'Hello \U0001f1f7\U0001f1fa hello' 

Lo que funcionaría mejor es

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

La solución para obtener exactamente lo que Tumbleweed pide, es una mezcla entre la respuesta mejor calificada y la respuesta del usuario594836. Este es el código que me funciona en Python 3.6.

 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 ['🤔 🙈 😌 💕 👭 👙'] 

Paso 1: asegúrese de que su texto se decodifique en utf-8 text.decode('utf-8')

Paso 2: ubique todos los emoji de su texto, debe separar el carácter del texto por carácter [str for str in decode]

Paso 3: Guarda todos los emoji en una lista [c for c in allchars if c in emoji.UNICODE_EMOJI] ejemplo completo:

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

si quieres eliminar del texto

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

Esta es una mejor solución cuando se trabaja con grandes conjuntos de datos, ya que no tiene que recorrer todos los emojis cada vez. Encontré esto para darme mejores resultados 🙂

Ok, tuve este mismo problema y encontré una solución que no requiere que importes ninguna biblioteca (como emoji o re) y es una sola línea de código. Devolverá todos los emojis en la cadena:

 def extract_emojis(sentence): return [word for word in sentence.split() if str(word.encode('unicode-escape'))[2] == '\\' ] 

Esto me permitió crear una solución liviana y espero que les ayude a todos. En realidad, necesitaba uno que filtraría cualquier emojis en una cadena, y eso es lo mismo que el código anterior pero con un cambio menor:

 def filter_emojis(sentence): return [word for word in sentence.split() if str(word.encode('unicode-escape'))[2] != '\\' ] 

Aquí hay un ejemplo de ello en acción:

  • a = ‘🤔 🙈 me así, bla es se 😌 ds 💕👭👙’
  • b = extract_emojis (a)
  • b = [‘🤔’, ‘🙈’, ‘😌’, ‘💕👭👙’]

Esta función espera una cadena para convertir la lista de entrada en cadena

 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 :['🙈', '😌', '💕', '👭', '👙'] 

Todos los emojis de Unicode con sus respectivos puntos de código están aquí . Son de 1F600 a 1F64F, por lo que puedes comstackrlos todos con un iterador similar a un rango.