python - webpagefx - unicode emoji
ΒΏCΓ³mo extraer todos los emojis del texto? (8)
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 de expresiones regulares 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 de arriba, y return emoji_list + flags
.
Vea esta publicación para más información sobre las banderas.
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.
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
[''π€ π π π π π'']
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 = [''π€'', ''π'', ''π'', ''πππ'']
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)
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 correcta 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 a la clase de caracteres manualmente. 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 caracteres no emoji, use una clase de caracteres que acepte emojies ( []
sin ^
). Como 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 :
Todos los emojis de Unicode con sus respectivos puntos de código están here . Son de 1F600 a 1F64F, por lo que puedes compilarlos todos con un iterador similar a un rango.
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