使用Python检测符号及乱码字符

最近在进行关键词的分析,中间涉及到对一些特殊的字符进行过滤的需求。包括带符号的(有部分还是SQL注入),并且存在一部分乱码的问题。梳理下来供后续使用。

检测字符串是否包含特殊符号

方案一:通过字符匹配的方式进行判定

def if_contain_symbol(keyword):
    symbols = "~!@#$%^&*()_+-*/<>,.[]\/"
    for symbol in symbols:
        if symbol in keyword:
            return True
    else:
        return False

方案二:使用正则表达式判断(经测试\W在包含中文的情况下可用)

import re
  
def if_contain_symbol(keyword):
    if re.search(r"\W", keyword):
        return True
    else:
        return False

检测字符串中是否有乱码

人眼能识别的乱码在程序看来并没有想象中那么简单。针对程序来说“涓囧厓锛屾厛锽勬崘鐚”本身也是正常的字符。下面分享下一些折中的方案:

方案一:对分词后的分词率进行统计

从概率层面,正常的文本分词率(文本长度/分词后个数)>2,而乱码字符则接近1。
具体代码如下:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# -*- encoding:utf-8 -*-
import jieba 
 
def if_contain_chaos(keyword):
    str_len = len(keyword)
    seg_len = len(jieba.lcut(keyword))
 
    if str_len / seg_len < 2:
        return True
    else:
        return False

存在的问题,如果字符串内存在英文,则此方法的可用性不高,特别是关键词长度非常小的场景。

方案二:通过是否包含生僻字的方法进行判断

1980年的GB2312一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。这6763个汉字在Unicode中不是连续的,分布在CJK统一汉字字符区(0x4E00-0x9FA5)的20902个汉字中。

对于直接将生僻字定义为非GB2312内字符。由于GB2312的字符不是连续的,所以不能直接使用正则表达式的方式进行限定。而我们的方案是通过将字符串的unicode转化为GB2312来判断是否含有生僻字。即当转化发生异常即为包含生僻字。

def if_contain_chaos(keyword):
    try:
        keyword.encode("gb2312")
    except UnicodeEncodeError:
        return True
    return False
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值