背景
在项目中需要对文本进行过滤,文本中主要的表情主要是微信的表情,其形式主要是“[表情名称]”,由于都是字符串,所以我打算使用正则的方式进行匹配后替换。
步骤
搜索微信表情库
要替换表情,需要有微信表情库,所以第一步先找微信的表情都有哪些,经过搜索,发现了这个页面 微信(Wechat)表情符号列表 有微信表情的列表,但是其是页面,不可以直接复制粘贴,因此就得想办法将其表情名称给拿下来。
获取微信名列表
对于页面的内容,我们可以使用JavaScript来获取dom节点的值,打开控制台,查看其节点,根据其特点,简单写了一段打印表情名称的js代码。
var doms = document.getElementsByClassName('emoji_card_list');
for(var i=0;i<doms.length;i++){
var tds = doms[i].getElementsByTagName('td');
for(var j=0;j<tds.length;j++){
var text = tds[j].innerText;
if(text.indexOf('[') === 0 || text.indexOf('/')===0) {
console.log(text);
}
}
}
复制代码
复制到控制台执行后,复制后得到这样格式的文本(只是部分内容):
[让我看看] debugger eval code:7:21
[666] debugger eval code:7:21
[翻白眼] debugger eval code:7:21
/微笑 debugger eval code:7:21
/撇嘴 debugger eval code:7:21
/色 debugger eval code:7:21
/害羞 debugger eval code:7:21
/闭嘴 debugger eval code:7:21
/睡 debugger eval code:7:21
/旺柴 debugger eval code:7:21
/瓢虫
复制代码
对于这样形式的内容,我们可以在文本编辑器中替换到后面内容,当然更可以使用Python来操作。
处理微信表情名称
在Python控制台中,我们可以很轻易的处理,通过下面的代码,可以获得最终的表情名称合集。
data = """上面复制的大段内容,复制后回车"""
data_list = [x.split(' ')[0] for x in data.split('\n')]
emoji_list = []
for x in all_emoj:
if x[0] == '/':
emoji_list.append('[%s]' % x[1:])
else:
emoji_list.append(x)
复制代码
正则匹配表情
有了表情内容,我们就使用正则对文本匹配了,匹配的代码如下:
def remove_emoji(text):
"""
去除文本中的表情符号,表情符号都是"[表情名称]" 这样的形式
return: str
"""
if '[' not in text:
return text
reg_expression = '|'.join([x.replace('[', '\[').replace(']', '\]') for x in emoji_list])
pattern = re.compile(reg_expression)
matched_words = pattern.findall(text)
# 使用set去重,可以防止查找到多个的时候进行多次循环
for matched_word in set(matched_words):
text = text.replace(matched_word, '')
return text
复制代码
测试结果如下,符合要求:
>>> remove_emoji("[哈哈][闭嘴][闭嘴]")
'[哈哈]'
复制代码
写在最后
因为我们项目中使用的是非标准Unicode表情,如果您的项目中使用的是标准的Unicode表情,可以使用Python的 emoji 包,里面有标准的表情列表,具体的可以参考网上的一篇文章使用python环境过滤文本当中的emoji表情。