我尝试从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)
但似乎几乎所有的字符都从文本中删除了。我从其他帖子中查了几个答案,不幸的是,这些都没有在这里工作。我在re.compile()中做错了吗?
这是一个示例输出,删除了所有字符:
“ ' //./” ! # # # …
答案 0 :(得分: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)
这可以简化为:
myre = re.compile(u'['
u'\U0001F300-\U0001F64F'
u'\U0001F680-\U0001F6FF'
u'\u2600-\u26FF\u2700-\u27BF]+',
re.UNICODE)
因为前两个范围相邻。
您的版本正在指定(添加了空格以便于阅读):
[\u1F30 0-\u1F5F F\u1F60 0-\u1F64 F\u1F68 0-\u1F6F F \u2600-\u26FF\u2700-\u27BF]+
那是因为\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: '
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)