Python实现过滤文本中表情符号

背景

在项目中需要对文本进行过滤,文本中主要的表情主要是微信的表情,其形式主要是“[表情名称]”,由于都是字符串,所以我打算使用正则的方式进行匹配后替换。

步骤

搜索微信表情库

要替换表情,需要有微信表情库,所以第一步先找微信的表情都有哪些,经过搜索,发现了这个页面 微信(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表情

Guess you like

Origin juejin.im/post/7031832269811613732
Recommended