您没有对非 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 版本中定义的表情符号;它似乎涵盖了 Unicode 8.0 之前定义的表情符号(因为 U+1F91D HANDSHAKE 是在 Unicode 9.0 中添加的)。
如果您需要更新的正则表达式,请从a package that is actively trying to keep up-to-date on Emoji 获取一个;它特别支持生成这样的正则表达式:
import emoji
def remove_emoji(text):
return emoji.get_emoji_regexp().sub(u'', text)
该软件包目前是 Unicode 11.0 的最新版本,并且具有可快速更新到未来版本的基础架构。您的项目所要做的就是在有新版本时进行升级。