【问题标题】:python-re.sub() and unicodepython-re.sub() 和 unicode
【发布时间】:2016-07-31 07:52:36
【问题描述】:

我想用'' 替换所有表情符号,但我的正则表达式不起作用。
例如,

content= u'?\u86cb\u767d12\U0001f633\uff0c\u4f53\u6e29\u65e9\u6668\u6b63\u5e38\uff0c\u5348\u540e\u665a\u95f4\u53d1\u70ed\uff0c\u6211\u73b0\u5728\u8be5\u548b\U0001f633?'

我想用'' 替换所有的形式,比如\U0001f633,所以我写了代码:

print re.sub(ur'\\U[0-9a-fA-F]{8}','',content)

但它不起作用。
非常感谢。

【问题讨论】:

    标签: python python-2.7 unicode


    【解决方案1】:

    您将无法以这种方式识别正确解码的 unicode 代码点(如包含 \uXXXX 等的字符串)。正确解码后,当正则表达式解析器获取它们时,每个都是 * 字符。

    根据您的 python 是否仅使用 16 位 unicode 代码点编译,您将需要类似以下的模式:

    # 16-bit codepoints
    re_strip = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
    
    # 32-bit* codepoints
    re_strip = re.compile(u'[\U00010000-\U0010FFFF]')
    

    您的代码如下所示:

    import re
    
    # Pick a pattern, adjust as necessary
    #re_strip = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
    re_strip = re.compile(u'[\U00010000-\U0010FFFF]')
    
    content= u'[\u86cb\u767d12\U0001f633\uff0c\u4f53\u6e29\u65e9\u6668\u6b63\u5e38\uff0c\u5348\u540e\u665a\u95f4\u53d1\u70ed\uff0c\u6211\u73b0\u5728\u8be5\u548b\U0001f633]'
    print(content)
    
    stripped = re_strip.sub('', content)
    print(stripped)
    

    两个表达式,将stripped字符串中的字符数减少到26个。

    这些表情会去除你想要的表情符号,但也可能会去除你想要的其他东西。可能值得查看 unicode 代码点范围列表(例如 here)并调整它们。

    您可以通过执行以下操作来确定您的 python 安装是否只能识别 16 位代码点:

    import sys
    print(sys.maxunicode.bit_length())
    

    如果显示为 16,您将需要第一个正则表达式。如果它显示大于 16(对我来说是 21),那么第二个就是你想要的。

    在带有错误sys.maxunicode 的python 安装上使用时,这两个表达式都不起作用。

    另请参阅:this 相关。

    【讨论】:

    • 非常感谢。有用。但你说它也可能会剔除我想要的其他东西。那么如果我只想删除表情符号呢?内容可能包含汉字、数字、字母、标点符号和表情符号。顺便说一句,我的 python 仅使用 16 位 unicode 代码点编译。
    • 嗯,它可能。我“过滤”出来的代码点以 10000 here 开头。所以通过“标签”在“线性 B 音节”中的任何内容。根据我的经验,大多数字体甚至没有这些代码点的字形。因此,您想要的任何东西(非常)不太可能在该范围内,因此过滤可能没问题,但这只是需要注意的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2018-01-23
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多