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

93

我在Python中发现了一个用于删除表情符号的代码,但它不起作用。你能帮忙提供其他代码或修复这个代码吗?

我发现所有的表情符号都以\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)
但这仍然没有移除表情符号并显示它们!有任何线索为什么会这样吗? 在此输入图像描述

3
Emoji字符不仅限于单个范围(请参阅字符列表)。 - 一二三
1
你的表情符号不以\xf开头。你可能在UTF-8中看到了表示该字符串的字节,而第一个字节是0xf0 - roeland
请查看以下链接,因为所选答案存在错误: https://stackoverflow.com/questions/52464119/removing-emoji-from-text-remove-also-japanese-langauge/52464600#52464600 - Sion C
27个回答

8

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

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

这就是你所需要的全部内容。


6

4

这是我的解决方案。该解决方案删除了无法由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)

4

这是一个最简单的代码,用于删除所有表情符号。

import emoji

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

使用pip安装emoji模块:


我该如何移除像 :),;) 这样的表情符号? - Sunil Garg
这只支持这种类型的表情符号 ❗。 - Nori
@SunilGarg 那些并不是技术上的表情符号,它们是表情符号 - Asclepius

3

由于 [...] 表示一组字符中的任意一个,而在由破折号分隔的组中的两个字符表示一段范围内的字符(通常为 "a-z" 或 "0-9"),你的模式表达的是 "斜杠,后跟包含 x、{、1、F、6、0、1 以及范围 } 到 x、{、1、F、6、4、f 或 } 的任意字符",然后是一个斜杠和字母 u。中间的那个范围就是 re 称之为坏字符范围。


你能看一下这个更新并告诉我代码哪里出了问题吗? - Mona Jalal

3
这是一个使用emoji库的 Python 3 脚本,它使用了 kingmakerking 和 Martijn Pieters 在他们的回答 / 评论中建议的 get_emoji_regexp() 函数。
它从文件中读取文本,并将无表情符号的文本写入另一个文件。
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)

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

2
将字符串转换为另一个字符集可能会有所帮助:
text.encode('latin-1', 'ignore').decode('latin-1')

敬祝好运。


简单胜于复杂。 - wrivas

1
尝试了所有答案,不幸的是它们都没有删除新的拥抱表情符号、碰杯表情符号等等。最终从 Github 上的 Python emoji 包中获取了所有可能的表情符号列表,由于 StackOverflow 答案有 30k 字符限制,而这个列表超过了 70k 字符,所以我不得不创建了一个 Gist。

当我尝试使用您的列表时,我在Python3上遇到了这个错误 TypeError: compile() got multiple values for argument 'flags' - Sohaib Farooqi
@bro-grammer,只需删除多余的“,”即可正常工作。 - Leonardo Neves
尝试这个result = re.sub('[(\U0001F600-\U0001F92F|\U0001F300-\U0001F5FF|\U0001F680-\U0001F6FF|\U0001F190-\U0001F1FF|\U00002702-\U000027B0|\U0001F926-\U0001FA9F|\u200d|\u2640-\u2642|\u2600-\u2B55|\u23cf|\u23e9|\u231a|\ufe0f)]+','', text_with_emojis) 这将删除几乎所有的表情符号。 - Nimin Unnikrishnan

1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接