2016-07-31 61 views
2

我想用''替换所有表情符号,但我的regEx不起作用。
例如,python-re.sub()和unicode

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)

但它不工作。
非常感谢。

回答

3

您将无法识别正确解码的unicode码点(包含\uXXXX等的字符串)。正确解码,到正则表达式解析器到达它们时,每个码都是*字符。

根据您的蟒蛇是否只有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

这些表达式剔除你后的表情符号,BU t也可以去掉其他东西想要的。值得查看一个unicode代码点范围列表(例如here)并对其进行调整。

你可以决定你是否蟒安装只能通过执行类似识别16位码点:

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

如果这显示16,你需要第一个正则表达式。如果它显示的东西大于16(对我来说它说21),第二个是你想要的。

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

另请参阅:this相关。

+0

非常感谢。有用。但是你说它可能会剥夺我想要的其他东西。那么,如果我只想删除表情符号呢?内容可能包含汉字,数字,字母,标点和表情符号。顺便说一句,我的python只编译了16位unicode代码点。 – sophiaCY

+0

嗯,它*可能*。我“过滤”出的代码点从10000开始(这里是http://jrgraphix.net/research/unicode_blocks.php)。因此,“线性B音节”到“标签”中的任何内容。根据我的经验,大多数字体甚至没有这些代码点的字形。所以,你所要做的任何事情都不太可能在这个范围内,所以过滤可能很好,但这只是一些需要注意的事情。 – jedwards