使用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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章