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

You*_*ung 7 python regex unicode tweets emoji

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

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

但似乎几乎所有的字符都从文本中删除.我从其他帖子中查了几个答案,不幸的是,这些都没有在这里工作.我在re.compile()中做错了吗?

这是一个删除所有字符的示例输出:

“   '   //./” ! # # # …
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 29

您没有为非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)
Run Code Online (Sandbox Code Playgroud)

这可以简化为:

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

因为你的前两个范围是相邻的.

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

[\u1F30 0-\u1F5F F\u1F60 0-\u1F64 F\u1F68 0-\u1F6F F \u2600-\u26FF\u2700-\u27BF]+
Run Code Online (Sandbox Code Playgroud)

那是因为\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: '
Run Code Online (Sandbox Code Playgroud)

UCS-2的等价物是:

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

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

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)
Run Code Online (Sandbox Code Playgroud)

  • 正是我在上面评论的内容,但是我得到了`sre_constants.error:在Python 2中构建的错误字符范围. (3认同)
  • @MarkTolonen:添加了UCS-2版本. (2认同)