从Python中的字符串中删除表情符号

时间:2015-10-29 02:03:53

标签: python string unicode special-characters emoji

我在Python中发现这个代码用于删除表情符号,但它无效。你能帮忙解决其他问题吗?

我观察到我的所有emjois都以\xf开头,但当我尝试搜索str.startswith("\xf")时,我收到了无效的字符错误。

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

这是错误:

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

列表中的每个项目都可以是单词['This', 'dog', '\xf0\x9f\x98\x82', 'https://t.co/5N86jYipOI']

更新: 我用了其他代码:

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)

但是这仍然没有删除表情符号并显示它们!任何线索为什么会这样? enter image description here

21 个答案:

答案 0 :(得分:33)

在Python 2上,您必须使用u'' literal来创建Unicode字符串。此外,您应该传递re.UNICODE标记并将输入数据转换为Unicode(例如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

输出

This dog 
This dog 

注意:emoji_pattern只匹配一些表情符号(不是全部)。请参阅Which Characters are Emoji

答案 1 :(得分:16)

如果您正在使用已接受答案中的示例并且仍然会遇到错误的字符范围&#34;错误,那么您可能正在使用窄版本(see this answer获取更多详细信息)。似乎有效的正则表达式的重新格式化版本是:

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)

答案 2 :(得分:9)

完成vesrion删除表情符号:

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)

答案 3 :(得分:6)

接受的答案,其他人为我工作了一段时间,但我最终决定剥离Basic Multilingual Plane以外的所有字符。这排除了将来添加到其他Unicode平面(表情符号等等),这意味着每次添加新的Unicode字符时我都不必更新代码:)。

在Python 2.7中,如果您的文本尚未转换为unicode,则使用下面的否定正则表达式(在正则表达式中任何 ,这是BMP中的所有字符)代理商的 除了 ,用于创建2个字节Supplementary Multilingual Plane个字符。)

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

答案 4 :(得分:4)

我试图收集unicode的完整列表。 我用它从推文中提取表情符号,对我来说很好用。

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

答案 5 :(得分:3)

这是我的解决方案。此解决方案删除了​​python ‍♂和‍♀

无法修复的其他男女表情符号
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)

答案 6 :(得分:3)

因为[...]表示一组字符中的任何一个,并且因为用短划线分隔的组中的两个字符表示一系列字符(通常,&#34; a-z&#34;或&# 34; 0-9&#34;),你的模式是&#34;一个斜杠,后跟包含x,{,1,F,6,0,1,范围}到x,{的组中的任何字符, 1,F,6,4,f或}&#34;然后是斜线和字母u&#34;。中间的那个范围就是所谓的坏字符范围。

答案 7 :(得分:2)

这对我有用。它的动机是https://stackoverflow.com/a/43813727/6579239

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

答案 8 :(得分:2)

已删除表情符号的完整版本

def remove_emojis(data):
    emoj = re.compile("["
        u"\U0001F600-\U0001F64F"  # emoticons
        u"\U0001F300-\U0001F5FF"  # symbols & pictographs
        u"\U0001F680-\U0001F6FF"  # transport & map symbols
        u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
        u"\U00002500-\U00002BEF"  # chinese char
        u"\U00002702-\U000027B0"
        u"\U00002702-\U000027B0"
        u"\U000024C2-\U0001F251"
        u"\U0001f926-\U0001f937"
        u"\U00010000-\U0010ffff"
        u"\u2640-\u2642" 
        u"\u2600-\u2B55"
        u"\u200d"
        u"\u23cf"
        u"\u23e9"
        u"\u231a"
        u"\ufe0f"  # dingbats
        u"\u3030"
                      "]+", re.UNICODE)
    return re.sub(emoj, '', data)

答案 9 :(得分:2)

我知道这可能与所问的问题没有直接关系,但这有助于解决父级问题,即从文本中删除表情符号。 python中有一个名为demoji的模块,可以非常准确地完成此任务并删除几乎所有类型的表情符号。它还会定期更新,以提供最新的表情符号删除支持。 为了删除表情符号demoji.replace(text, '')

答案 10 :(得分:2)

这是删除所有表情符号的最简单代码。

import emoji

def remove_emojis(text: str) -> str:
    return ''.join(c for c in text if c not in emoji.UNICODE_EMOJI)

pip install emoji

答案 11 :(得分:1)

如果您不热衷于使用正则表达式,最佳解决方案可能是使用emoji python package

这是一个返回表情符号自由文本的简单函数(感谢这个SO answer):

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

如果您正在处理包含表情符号的字符串,这很简单

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

如果你正在处理unicode(如@jfs的例子),只需用utf-8编码。

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

答案 12 :(得分:1)

像这样将字符串转换为另一个字符集可能会有所帮助:

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

亲切的问候。

答案 13 :(得分:1)

对此的最佳解决方案是使用外部库emoji。该库会不断更新最新的表情符号,因此可用于在任何文本中查找它们。不同于删除所有unicode字符的ascii解码方法,此方法保留它们并仅删除表情符号。

  1. 如果没有,请首先安装表情符号库:pip install emoji
  2. 接下来将其导入您的文件/项目中:import emoji
  3. 现在要删除所有表情符号,请使用以下语句: emoji.get_emoji_regexp().sub(u'', msg),其中msg是要编辑的文本

这就是您所需要的。

答案 14 :(得分:1)

我可以通过以下方式摆脱表情符号。

表情符号安装 https://pypi.org/project/emoji/

$ pip3 install emoji
import emoji

def remove_emoji(string):
    return emoji.get_emoji_regexp().sub(u'', string)

emojis = '(`ヘ´) ?⭕????⭐????????⏩'
print(remove_emoji(emojis))

## Output result
(`ヘ´)

答案 15 :(得分:1)

使用 Demoji 包, https://pypi.org/project/demoji/

import demoji

text="?????"
emoji_less_text = demoji.replace(text, "")

答案 16 :(得分:0)

不幸的是,尝试了所有的答案,他们没有删除新的拥抱面部表情符号或叮当作响的眼镜表情符号,还有更多。

结束了所有可能的表情符号列表,取自github上的python表情符号包,我不得不创建一个要点,因为stackoverflow答案有30k字符限制,而且它超过70k字符。

Here's the list

答案 17 :(得分:0)

这是一个Python 3脚本,它使用表情符号库的get_emoji_regexp()-由kingmakerking和Martijn Pieters在他们的回答/评论中建议。

它从文件中读取文本,并将无表情符号的文本写入另一个文件。

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)

答案 18 :(得分:0)

对我来说,以下代码在python 3.8中可以代替表情符号:

import re
result = re.sub('[(\U0001F600-\U0001F92F|\U0001F300-\U0001F5FF|\U0001F680-\U0001F6FF|\U0001F190-\U0001F1FF|\U00002702-\U000027B0|\U0001F926-\U0001FA9F|\u200d|\u2640-\u2642|\u2600-\u2B55|\u23cf|\u23e9|\u231a|\ufe0f)]+','','A quick brown fox jumps over the lazy dog??')

它是此处给出答案的简化版本。 我测试了此代码是否支持i18n,并用英语,俄语,中文和日语进行了测试。只有表情符号被删除。

这不是一个详尽的列表,可能错过了一些表情符号,但适用于大多数常见的表情符号

答案 19 :(得分:0)

我只是使用正则表达式删除了所有特殊字符,这对我有用。

sent_0 = re.sub('[^A-Za-z0-9]+', ' ', sent_0)

答案 20 :(得分:0)

对于那些仍在使用 Python 2.7 的人,这个 regex 可能会有所帮助:

(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c\ude32-\ude3a]|[\ud83c\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])

所以要在你的代码中使用它,它看起来像这样:

emoji_pattern = re.compile(
    u"(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c\ude32-\ude3a]|[\ud83c\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])"
    "+", flags=re.UNICODE)

为什么现在我们实际上不再使用 Python 2.7 了,为什么仍然需要它? 一些系统/Python 实现仍然使用 Python 2.7,例如 Python UDF在 Amazon Redshift 中。