[python每日一练]--0012:敏感词过滤 type2

题目链接:https://github.com/Show-Me-the-Code/show-me-the-code
代码github链接:https://github.com/wjsaya/python_spider_learn/tree/master/python_daily
个人博客地址:https://wjsaya.github.io
第 0012 题: 敏感词文本文件 filtered_words.txt,里面的内容 和 0011题一样,当用户输入敏感词语,则用 星号 * 替换,例如当用户输入「北京是个好城市」,则变成「**是个好城市」。

北京
程序员
公务员
...

思路:

  1. 从文件解析敏感词、从终端获取用户输入。
  2. 根据敏感词对用户输入进行过滤。这里过滤需要考虑到输入内容不止一个需要过滤的词,所以稍微麻烦点:
    1. 读取所有的屏蔽词,放进一个列表
    2. 获取用户输入
    3. 遍历屏蔽词列表,用屏蔽词检索用户输入
      • 如果有屏蔽词,将其替换为*
      • 如果没有,不进行操作
      • 返回处理后的用户输入
      • 用下一个屏蔽词对处理后的用户输入进行上述操作
    4. 所有屏蔽词遍历完毕,输出过滤后字符串

敏感词列表(filtered_words.txt)

北京
程序员
公务员
领导
牛比
牛逼
你娘
你妈
love
sex
jiangge

代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*- 
# @Author:  wjsaya(http://www.wjsaya.top) 
# @Date:    2018-08-10 12:33:32 
# @Last Modified by:    wjsaya(http://www.wjsaya.top) 
# @Last Modified time:  2018-08-13 23:02:29 

class fliter():
    '''fliter类 \n
    传入敏感词文件 \n
    获取用户输入,根据敏感词文件对输入进行过滤
    '''
    def __init__(self, fileName):
        dirty_dict = self.get_dirty(file)
        self.fliteredString = self.fliterMaster(dirty_dict)

    def get_dirty(self, fileName=''):
        '''解析文件获取敏感词,返回一个敏感词列表
        '''
        with open (fileName, 'r', encoding='utf-8') as f:
            re = f.readlines()

        for i in range(len(re)):
            re[i] = re[i].strip('\n')

        return(re)

    def fliterMaster(self, dirty_dict):
        '''过滤主函数 \n 
        获取用户输入,获取待屏蔽词典 \n 
        遍历屏蔽词 ,进行过滤\n
        返回屏蔽后字符串
        '''
        instr = input("不要输入敏感词哦:")
        self.originString = instr
        # instr = ("程序员很牛比,但是运维更牛逼")
        for i in dirty_dict:               
            inArray = self.str2array(instr)
            inDirtArray = self.str2array(i)

            pos_list = self.get_pos(inArray, inDirtArray[0])
            if pos_list is None:    # 未找到可能存在的屏蔽词,跳过过滤部分
                continue
            else:   # 可能有屏蔽词,交给fliterWorker进一步处理
                for tag in pos_list:
                    inArray = self.fliterWorker(tag, inArray, inDirtArray)
                instr = ''.join(inArray)

        return instr

    def str2array(self, instr):
        '''字符串单个拆分为数组
        '''
        redict = []
        for i in instr:
            redict.append(i)
        return redict

    def get_pos(self, instr, word):
        '''传入句子,传入词 \n
        找出此词在居中的所有位置
        '''
        try:
            re = instr.index(word)
            resp = []
            resp.append(re)
            while(1):
                try:
                    re = instr.index(word, re+1, len(instr))
                    resp.append(re)
                except Exception as e:
                    break
            return resp

        except Exception as e:
            return None


    def fliterWorker(self, tag, inArray, inDirtArray):
        '''IN:字符数组;屏蔽词数组;可能存在屏蔽词的位置 \n
        OUT:替换完毕之后的字符数组
        '''
        resp = ""
        resp_temp = "" 
        for i in range(tag):    # 0-pos不变,从pos开始向后匹配
            resp += inArray[i]

        for i in range(len(inDirtArray)):
            if inArray[tag+i] == inDirtArray[i]:
            # 字符数组和屏蔽词数组从左向右匹配,如果匹配到一个,resp_temp追加一个*
            # 任一过滤词没匹配到,resp_temp直接置为空
                resp_temp += "*"
            else:
                resp_temp = ''
                break

        if resp_temp == '': # resp_temp为空,直接返回原字符数组
            return inArray

        else:   # resp_temp非空,则有匹配,把resp_temp加到原字符数组
            resp += resp_temp
            for i in range(tag+len(inDirtArray), len(inArray)):
                # resp_temp加完之后,把原句剩下的内容追加
                resp += inArray[i]
        return resp


if __name__ == '__main__':
    file = 'filtered_words.txt'
    fliter1 = fliter(file)
    print("未过滤字符串为:" + fliter1.originString)
    print("过滤后字符串为:" + fliter1.fliteredString)

效果图:

0012

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值