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

使用Python检测符号及乱码字符最近在进行关键词的分析,中间涉及到对一些特殊的字符进行过滤的需求。包括带符号的(有部分还是SQL注入),并且存在一部分乱码的问题。梳理下来供后续使用。检测字符串是否包含特殊符号方案一:通过字符匹配的方式进行判定defif_contain_symbol(keyword):symbols=”~!@#$%^&*()_+-*/<>,.[]\/”forsymbolinsymbols:ifsymbolinkeyword:

大家好,又见面了,我是你们的朋友全栈君。

最近在进行关键词的分析,中间涉及到对一些特殊的字符进行过滤的需求。包括带符号的(有部分还是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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136813.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • javac 与 java的区别[通俗易懂]

    javac 与 java的区别[通俗易懂]java编译器名称是javac,是将源文件编译为字节码文件的程序,而java是java解释器的名称,也就是解释和执行字节码文件的程序。注意:::java源文件必须是具有  .java 扩展名java字节码文件必须具有  .class 扩展名 javac可以将java源文件编译为class字节码文件如javacHelloWorld.java运行javac命令后,如果成功编译没有错误的话…

  • 安装 | 最新MATLAB 2020b(64位)安装教程完整版[通俗易懂]

    安装 | 最新MATLAB 2020b(64位)安装教程完整版[通俗易懂]博主github:https://github.com/MichaelBeechan博主CSDN:https://blog.csdn.net/u011344545精简安装链接:https://blog.csdn.net/u011344545/article/details/109728674下载链接链接:https://pan.baidu.com/s/1g61g2qJO2MtZVkeMsuxhuQ提取码:打赏连接:https://blog.csdn.net/u011344545/article/

  • 不能复制文字的网页文字复制怎么办_html循环粘贴

    不能复制文字的网页文字复制怎么办_html循环粘贴网页无法复制文字怎么办?当我们在电脑上需要复制某个网页上的文字时,发现我们不能选择复制粘贴文字,那这种情况该怎么解决呢,网页无法复制文字怎么办,怎么解决网页无法复制粘贴文字情况,下面就和小编一起来看看吧!1.可以使用谷歌浏览器扩展程序AllowCopy解决问题,打开谷歌浏览器的网上应用店,搜索【AllowCopy】;2.然后找到SimpleAllowCopy,点击【添加至Chrome】将其…

  • STM32看门狗详解[通俗易懂]

    STM32看门狗详解[通俗易懂]看门狗的作用:防止单片机因未知原因死机或比我们预期的时间过长长时间不能响应,如果出现这种问题,看门狗就会把单片机复位独立看门狗(IWDG):时钟来源:内部低速时钟(LSI),所以用看门狗时不需要配置时钟一般配置过程:寄存器:IWDG_KR:32位寄存器,低16位有效,只写写入0xAAAA,喂狗0x5555,取消IWDG_PR、IWDG_RLR的写保护0xCCCC,启动看门狗IWDG_PR:32位寄存器,低3位有效配置分频系数,4*2^prer.

  • pytest的assert_java单元测试断言

    pytest的assert_java单元测试断言前言断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了。什么是断言呢?简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试failed

  • stm32 sd卡读写_sd卡引脚定义图

    stm32 sd卡读写_sd卡引脚定义图SD卡   SD卡(SecureDigitalMemoryCard)即:安全数码卡,它是在MMC的基础上发展而来,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。   SD卡按容量分类,可以分为3类:SD卡、SDHC卡、SDXC…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号