Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用re删除unicode表情符号_Python_Regex_Unicode_Emoji_Tweets - Fatal编程技术网

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

在python中使用re删除unicode表情符号,python,regex,unicode,emoji,tweets,Python,Regex,Unicode,Emoji,Tweets,我尝试从unicode推文文本中删除表情符号,并使用 myre = re.compile(u'[\u1F300-\u1F5FF\u1F600-\u1F64F\u1F680-\u1F6FF\u2600-\u26FF\u2700-\u27BF]+',re.UNICODE) print myre.sub('', text) 但看起来几乎所有的字符都从文本中删除了。我已经检查了其他帖子的几个答案,不幸的是,没有一个在这里有效。我在re.compile()中做错了什么吗 以下是删除所有字符的示例输出:

我尝试从unicode推文文本中删除表情符号,并使用

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)
因为前两个范围是相邻的

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

这是因为
\uxxx
转义序列总是只需要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之前定义的表情符号(因为它是在Unicode 9.0中添加的)

如果你需要一个更新的正则表达式,从;它特别支持生成这样的正则表达式:

import emoji

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

该软件包目前是Unicode 11.0的最新版本,并具有可快速更新到未来版本的基础设施。您的项目只需在有新版本时升级即可。

这是Python 2吗?Python可以通过广泛或狭窄的Unicode支持进行构建;您可能有一个UCS-2版本,而不是UCS-4版本,这会影响您对正则表达式的处理。请也给我们一个输入示例。我能够重现您的问题,我还看到UCS-2版本在尝试编译表达式时抛出异常,所以这不是这里的问题。
u'\u1f300'
应该是
u'\U0001f300'
。第一个是
'\u1f30'
'0'
。正如我刚才所评论的,但我得到了
sre_常量。错误:Python2窄版上的字符范围不正确。@MarkTolonen:是的,您只能在宽版上使用它,请参阅以获取方法(您必须匹配UTF-16代理项对)@MarkTolonen:添加了UCS-2版本。这就是我使用Python 3.3+的原因:)@abc:BMP使用的代码点最多为0xFFFF。那是四位数。BMP之外的任何内容都使用四个以上的十六进制数字,因此不能对这些数字使用
\uhhh
4位语法,而是需要使用
\uhhhhh
8位语法。
import emoji

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