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

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

但这还是不能移除表情并显示出来,知道为什么吗? enter image description here

149639 次浏览

因为 [...]表示一组字符中的任何一个,并且因为一组中由破折号分隔的两个字符表示一个字符范围(通常是“ a-z”或“0-9”) ,所以模式表示“一个斜杠,后跟包含 x、{、1、 F、6、0、1的组中的任何字符,从}到 x、{、1、 F、6、4、 f 或}”,后跟一个斜杠和字母 u。中间的那个范围就是所谓的坏字符范围。

在 Python2上,必须使用 u''文本来创建 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只匹配一些表情符号(不是全部)。参见 哪些字符是表情符号

如果您使用的示例来自已接受的答案,但仍然得到“坏字符范围”错误,那么您可能使用了一个狭窄的构建(详细信息请参阅 看看这个答案)。正则表达式的一个重新格式化的版本似乎可以工作:

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)

接受了答案,其他人为我工作了一段时间,但我最终决定剥离所有字符以外的 基本多语言平面。这不包括未来添加到其他 Unicode 平面(表情符号和其他类似表情符号的位置) ,这意味着我不必每次添加新的 Unicode 字符时都更新我的代码:)。

在 Python 2.7中,如果你的文本还没有转换成 unicode,然后使用下面的负正则表达式(在正则表达式中使用任何 不是字符,它是 BMP 除非中用于代理的所有字符,用于创建2字节的 多语种辅助平面字符)。

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

移除表情符号的完整版本:

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

尝试了所有的答案,不幸的是,他们没有删除新的拥抱面部表情或碰杯表情或,和更多。

最后得到了一个所有可能的表情符号的列表,取自 github 上的 python emoji 软件包,我不得不创建一个大意,因为对于 stackoverflow 的回答有30k 字符的限制,而且超过了70k 字符。

我用@jfs 更新了我的回答,因为我之前的回答没有考虑到其他 Unicode 标准,如拉丁语、希腊语等。StackOverFlow 不允许我删除我以前的答案,因此我更新它,以匹配最可接受的答案的问题。

#!/usr/bin/env python
import re


text = u'This is a smiley face \U0001f602'
print(text) # with emoji


def deEmojify(text):
regrex_pattern = re.compile(pattern = "["
u"\U0001F600-\U0001F64F"  # emoticons
u"\U0001F300-\U0001F5FF"  # symbols & pictographs
u"\U0001F680-\U0001F6FF"  # transport & map symbols
u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
"]+", flags = re.UNICODE)
return regrex_pattern.sub(r'',text)


print(deEmojify(text))

这是我以前的答案,不要用这个。

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

如果您不喜欢使用正则表达式,最好的解决方案可能是使用 巨蟒表情包

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

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

编辑

基于上述评论,它应该像下面这样简单:

def give_emoji_free_text(text):
return emoji.get_emoji_regexp().sub(r'', text.decode('utf8'))

这就是我的解决办法。这个解决方案去除了不能被巨蟒公司或公司重新绘制的额外的男性和女性表情符号

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)

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

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

问候你。

我试图收集完整的 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)

下面是一个 Python 3脚本,它使用了 emoji 库的 get_emoji_regexp()——正如 kingmaker 和 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)

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

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

最好的解决方案是使用外部库 表情符号。该库不断更新最新的表情符号,因此可以用来找到他们在任何文本。不同于 ascii 解码方法,该方法删除所有 Unicode 字符,这种方法保留它们,只删除表情符号。

  1. 首先安装表情符号库,如果你没有: pip install emoji
  2. 接下来将其导入到文件/项目中: import emoji
  3. 现在删除所有表情符号,使用声明: 其中 msg 是要编辑的文本

这就够了。

我知道这可能不直接关系到问题,但它是有助于解决父母的问题,删除文字表情符号。在 python 中有一个名为 表情的模块,它可以非常精确地完成这项任务,并删除几乎所有类型的表情符号。它还定期更新,以提供最新的表情符号删除支持。 用于删除表情符号 demoji.replace(text, '')

对我来说,下面的代码在 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 支持,测试了英语,俄语,中文和日语。只有表情符号被删除。

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

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

import emoji


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

Pip 安装表情符号

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

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

对于那些仍在使用 Python 2.7的用户,这个 正则表达式可能会有所帮助:

(?:[\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,就像 Amazon Redshift 中的 Python UDF。

我通过以下方式摆脱了这个表情符号。

安装表情符号 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
(`ヘ´)

使用 Demoji 软件包, Https://pypi.org/project/demoji/

import demoji


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

这不仅仅是过滤掉表情符号。它删除了 unicode,但是试图以一种温和的方式来做这件事,如果可能的话,用相关的 ASCII 字符替换它。如果你的文本中没有很多 Unicode 撇号和 unicode 引号(通常来自苹果手持设备) ,而只有常规的 ASCII 撇号和引号,那将是一件好事。

unicodedata.normalize("NFKD", sentence).encode("ascii", "ignore")

这个很坚固,我和更多的警卫一起使用:

import unicodedata


def neutralize_unicode(value):
"""
Taking care of special characters as gently as possible


Args:
value (string): input string, can contain unicode characters


Returns:
:obj:`string` where the unicode characters are replaced with standard
ASCII counterparts (for example en-dash and em-dash with regular dash,
apostrophe and quotation variations with the standard ones) or taken
out if there's no substitute.
"""
if not value or not isinstance(value, basestring):
return value


if isinstance(value, str):
return value


return unicodedata.normalize("NFKD", value).encode("ascii", "ignore")

这是蟒蛇二号。

我找到了两个表情符号来代替表情符号:

表情符号 : 一个 href = “ https://pypi.org/project/Emoji/”rel = “ nofollow noReferrer”> https://pypi.org/project/Emoji/

import emoji
string = "🦑 👍 🔥"
emoji.replace_emoji(string, replace="!")

Https://pypi.org/project/Demoji/

import demoji
string = "🦑 👍 🔥"
demoji.replace(string, repl="!")

他们都有其他有用的方法。

我还想删除文本文件中的表情符号。但是大多数的解决方案都给出了 Unicode 的范围来删除表情符号,这不是一个非常合适的方法。Remove _ emoji 方法是一个内置方法,由 Python 中的 clean-text 库提供。我们可以用它来清除有表情符号的数据。我们需要从 pip 安装它,以便在我们的程序中使用它:

pip install clean-text

我们可以使用以下语法来使用它:

#import clean function
from cleantext import clean


#provide string with emojis
text = "Hello world!😀🤣"


#print text after removing the emojis from it
print(clean(text, no_emoji=True))

产出:

Hello world!