当前位置: 首页 > 面试题库 >

在python中使用re删除unicode表情符号

郭元明
2023-03-14
问题内容

我试图从unicode鸣叫文本中删除表情符号,并使用python 2.7打印出结果

myre = re.compile(u'[\u1F300-\u1F5FF\u1F600-\u1F64F\u1F680-\u1F6FF\u2600-\u26FF\u2700-\u27BF]+',re.UNICODE)
print myre.sub('', text)

但似乎几乎所有字符都已从文本中删除。我检查了其他帖子的几个答案,很遗憾,这些答案都无法在此工作。我在re.compile()中做任何错吗?

这是一个示例输出,其中删除了所有字符:

“   '   //./” ! # # # …

问题答案:

您未对非BMP unicode点使用正确的符号;您要使用\U0001FFFF大写 U和8位数字:

myre = re.compile(u'['
    u'\U0001F300-\U0001F5FF'
    u'\U0001F600-\U0001F64F'
    u'\U0001F680-\U0001F6FF'
    u'\u2600-\u26FF\u2700-\u27BF]+', 
    re.UNICODE)

可以简化为:

myre = re.compile(u'['
    u'\U0001F300-\U0001F64F'
    u'\U0001F680-\U0001F6FF'
    u'\u2600-\u26FF\u2700-\u27BF]+', 
    re.UNICODE)

因为您的前两个范围是相邻的。

您的版本正在指定(增加了可读性的空格):

[\u1F30 0-\u1F5F F\u1F60 0-\u1F64 F\u1F68 0-\u1F6F F \u2600-\u26FF\u2700-\u27BF]+

这是因为\uxxxx转义序列始终仅使用4个十六进制数字,而不是5。

这些范围中最大的范围是0-\u1F6F(因此,从数字0),它涵盖了Unicode标准的
很大 范围。

如果您使用UCS-4宽的Python可执行文件,则更正后的表达式将起作用:

>>> import re
>>> myre = re.compile(u'['
...     u'\U0001F300-\U0001F64F'
...     u'\U0001F680-\U0001F6FF'
...     u'\u2600-\u26FF\u2700-\u27BF]+', 
...     re.UNICODE)
>>> myre.sub('', u'Some example text with a sleepy face: \U0001f62a')
u'Some example text with a sleepy face: '

UCS-2等效项是:

myre = re.compile(u'('
    u'\ud83c[\udf00-\udfff]|'
    u'\ud83d[\udc00-\ude4f\ude80-\udeff]|'
    u'[\u2600-\u26FF\u2700-\u27BF])+', 
    re.UNICODE)

您可以使用异常处理程序将两者结合到脚本中:

try:
    # Wide UCS-4 build
    myre = re.compile(u'['
        u'\U0001F300-\U0001F64F'
        u'\U0001F680-\U0001F6FF'
        u'\u2600-\u26FF\u2700-\u27BF]+', 
        re.UNICODE)
except re.error:
    # Narrow UCS-2 build
    myre = re.compile(u'('
        u'\ud83c[\udf00-\udfff]|'
        u'\ud83d[\udc00-\ude4f\ude80-\udeff]|'
        u'[\u2600-\u26FF\u2700-\u27BF])+', 
        re.UNICODE)

当然,正则表达式已经过时了,因为它不包括在较新的Unicode版本中定义的Emoji。它似乎涵盖了Emoji定义的Unicode 8.0(因为Unicode
9.0中添加了U + 1F91D HANDSHAKE)。

如果您需要最新的正则表达式,请从积极尝试使Emoji保持最新状态的软件包中获取一个;它特别支持生成这样的正则表达式:

import emoji

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

该软件包当前是Unicode 11.0的最新版本,并具有可以快速更新到将来发行版的基础结构。您的项目要做的就是在有新版本时进行升级。



 类似资料:
  • 问题内容: 列出以下MySql命令之间的区别。 删除表 tablename ; 截断表 tablename ; 从 表名 中删除1; 另外,请根据您的经验告诉我每种产品的典型使用场景。 问题答案: 在此之后,它 消失了 。没有桌子了。没有更多数据。 当您不再需要该表时,请使用它。 此后,该表为空,并且(重要地)自动递增键被重置为1。从字面上看,这就像拥有一个全新的表。 当您只需要一个空表时,请使用

  • 问题内容: 我在Python中有这样的字符串: 我该如何删除 从字符串的一部分? 问题答案: 您可以将其编码为并忽略错误: 输出:

  • 我正在尝试为我的android应用程序创建自定义视图。在函数中,我试图使用其值绘制表情符号,但这似乎不起作用。以下是代码: 有人知道这附近有没有工作吗?还是我做错了什么? 编辑[第二个问题]:通过我在下面提交的hack,我看到Emojis正在上绘制的内渲染,但与在正常TextView上设置的Emojis相比,它们显着变钝,如下所示: 你知道我错过了什么吗?

  • 问题内容: 我有一个要从中提取3组的字符串: 月名称可能包含非ASCII字符,因此对我不起作用: 我可以使用,但它匹配数字和下划线: 我尝试使用[:alpha:],但是不起作用: 如果我能以某种方式匹配而没有,但我不知道如何。即使我知道如何做到这一点,是否也有像Python中那样可用的现成快捷方式? 问题答案: 您可以构造一个新的角色类: 代替。翻译成英文,意思是“任何不是非字母数字字符(与相同)

  • 问题内容: 我正在寻找一种算法,该算法可以在带有变音符号的字符(tilde,circumflex,caret,umlaut,caron)与其“简单”字符之间进行映射。 例如: 等等。 我想用Java做到这一点,尽管我怀疑它应该是Unicode-y,并且应该可以轻松地以任何语言进行操作。 目的:允许轻松搜索带有变音标记的单词。例如,如果我有一个网球运动员数据库,并且输入了Björn_Borg,我还将

  • 问题内容: 我在Python中有一个Unicode字符串,我想删除所有的重音符号(变音符号)。 我在网上发现了一种用Java实现此目的的优雅方法: 将Unicode字符串转换为长规范化格式(带有单独的字母和变音符号) 删除所有Unicode类型为“变音符号”的字符。 我是否需要安装pyICU之类的库,还是仅使用python标准库就可以?那python 3呢? 重要说明:我想避免使用带有重音符号到非