python-re.sub()和unicode

时间:2016-07-31 07:52:36

标签: python python-2.7 unicode

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

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)

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

1 个答案:

答案 0 :(得分:3)

您将无法以这种方式识别正确解码的unicode代码点(作为包含\uXXXX的字符串等)正确解码,到正则表达式解析器到达它们时,每个都是*字符。< / p>

根据你的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),第二个就是你想要的。

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

另见:this相关。