最近在進行關鍵詞的分析,中間涉及到對一些特殊的字符進行過濾的需求。包括帶符號的(有部分還是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