eliminando emojis de una cadena en Python

Encontré este código en Python para eliminar emojis pero no está funcionando. ¿Puedes ayudar con otros códigos o arreglar esto?

He observado que todos mis emjo comienzan con \xf pero cuando bash buscar str.startswith("\xf") error de carácter no válido.

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

Aquí está el error:

 Traceback (most recent call last): File "test.py", line 52, in  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 

Cada uno de los elementos de una lista puede ser una palabra ['This', 'dog', '\xf0\x9f\x98\x82', 'https://t.co/5N86jYipOI']

ACTUALIZACIÓN: utilicé este otro código:

 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) 

¡Pero esto todavía no quita los emojis y los muestra! ¿Alguna pista de por qué es eso? introduzca la descripción de la imagen aquí

Esto funciona para mi Está motivado por https://stackoverflow.com/a/43813727/6579239

 def deEmojify(inputString): return inputString.encode('ascii', 'ignore').decode('ascii') 

En Python 2, tienes que usar u'' literal para crear una cadena Unicode. Además, debe pasar el indicador re.UNICODE y convertir sus datos de entrada a Unicode (por ejemplo, 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 

Salida

 This dog 😂 This dog 

Nota: emoji_pattern coincide solo con algunos emoji (no todos). Ver cuáles personajes son Emoji .

Si está utilizando el ejemplo de la respuesta aceptada y sigue recibiendo errores de “rango de caracteres incorrectos”, es probable que esté usando una versión reducida ( consulte esta respuesta para obtener más detalles). Una versión reformateada de la expresión regular que parece funcionar es:

 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) 

Vesrion completa de remover emojies:

 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) 

Respuesta aceptada, y otros trabajaron un poco por mí, pero finalmente decidí eliminar a todos los personajes fuera del Plano Multilingüe Básico . Esto excluye las futuras adiciones a otros planos Unicode (donde emoji y tal vivo), lo que significa que no tengo que actualizar mi código cada vez que se agreguen nuevos caracteres Unicode :).

En Python 2.7, conviértalo a Unicode si su texto aún no está, y luego use la expresión regular negativa que se encuentra debajo (sustituye cualquier cosa que no esté en expresión regular, que es todos los caracteres de BMP, excepto los sustitutos, que se usan para crear caracteres de 2 bytes del plano multilingüe suplementario ).

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

Intenté recostackr la lista completa de Unicodes. Lo uso para extraer emojis de tweets y funciona muy bien para mí.

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

Debido a que [...] significa cualquiera de un conjunto de caracteres, y porque dos caracteres en un grupo separados por un guión significa un rango de caracteres (a menudo, “az” o “0-9”), su patrón dice “a barra, seguido de cualquier carácter en el grupo que contenga x, {, 1, F, 6, 0, 1, el rango} a través de x, {, 1, F, 6, 4, fo} “seguido de una barra y letra u “. Ese rango en el medio es lo que se llama el rango de caracteres incorrectos.

esta es mi solucion Esta solución elimina emoji adicionales de hombre y mujer que no pueden ser generados por python 🤷‍♂ y 🤦‍♀

 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) 

Si no está interesado en usar expresiones regulares, la mejor solución podría ser usar el paquete emoji python .

Aquí hay una función simple para devolver texto libre de emoji (gracias a esta respuesta 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 está tratando con cadenas que contienen emojis, esto es sencillo

 >> 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 está tratando con Unicode (como en el ejemplo de @jfs), simplemente codifíquelo con utf-8.

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

Intenté todas las respuestas, desafortunadamente, no eliminaron el nuevo emoji hug o los lentes tintineantes emoji 🥂or 🤔, y mucho más.

Terminé con una lista de todos los emoji posibles, tomada del paquete emoji de python en github, y tuve que crear una idea porque hay un límite de 30k caracteres en las respuestas de stackoverflow y tiene más de 70k caracteres.

Aquí está la lista

Convertir la cadena en otro conjunto de caracteres como este podría ayudar:

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

Saludos cordiales.