在python中使用re删除unicode表情符号
我尝试从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()中做错了什么吗 以下是删除所有字符的示例输出:
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)