我试图从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位数字:
\U0001FFFF
U
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。
\uxxxx
这些范围中最大的范围是0-\u1F6F(因此,从数字0到Ὧ),它涵盖了Unicode标准的 很大 范围。
0-\u1F6F
0
Ὧ
如果您使用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的最新版本,并具有可以快速更新到将来发行版的基础结构。您的项目要做的就是在有新版本时进行升级。