python中最強大、最常用的就是字符串 str 了。當re模塊進行正則匹配時,如果是中文字符就會出現問題,尤其近期項目中遇到很奇葩的問題,在win server上生成的解析文件是utf-8格式,但到win10上偏偏生成了 gb2312。 這使得匹配搜索中文字符編程了亂碼。經過踩坑,總結一個通用的方法,就是先轉換成unicode編碼,通過Unicode編碼格式進行匹配,就沒問題了。不管是utf-8還是gb2312都OK的。
在str的文檔中有這樣的一句話:The string data type is also used to represent arrays of bytes, e.g., to hold data read from a file。也就是說在讀取一個文件的內容,或者從網絡上讀取到內容時,保持的對象爲str類型;如果想把一個str轉換成特定編碼類型,需要把str轉爲unicode,然後從unicode轉爲特定的編碼類型如:utf-8、gb2312等。
# 新的方式轉換
import chardet
def IsStrIncludeCodeTrans(src, pattern, flags=0):
"""
基於正則表達式,判斷字符串是否包含預期子串
"""
# 先直接對比是否有完全或部分匹配
if src.find(pattern) > -1:
return True
# 再按正則匹配
srcCodFormat = chardet.detect(src)['encoding']
patternCodFormat = chardet.detect(pattern)['encoding']
matchSet = ['ISO-8859-8','GB2312','gb2312']
if (srcCodFormat in matchSet):
src = src.decode('gb2312')
elif (srcCodFormat in ['utf-8']):
src = src.decode('utf-8')
if (patternCodFormat in matchSet):
pattern = pattern.decode('gb2312')
elif (patternCodFormat in ['utf-8']):
pattern = pattern.decode('utf-8')
'''
try:
# src = src.decode('utf-8')
# pattern = pattern.decode('utf-8')
src = src.decode('gb2312')
pattern = pattern.decode('2312')
except Exception as e:
print('IsStrInclude: ' + str(e) + '\npattern=' + pattern)
'''
# 以Unicode編碼進行匹配
matRet = re.search(pattern, src, flags)
return matRet != None
# 老方式都處理utf-8格式
def IsStrInclude(src, pattern, flags=0):
"""
基於正則表達式,判斷字符串是否包含預期子串
"""
# 先直接對比是否有完全或部分匹配
if src.find(pattern) > -1:
return True
# 再按正則匹配
try:
src = src.decode('utf-8')
pattern = pattern.decode('utf-8')
except Exception as e:
print('IsStrInclude: ' + str(e) + '\npattern=' + pattern)
if re.search(pattern, src, flags) != None:
return True
return False