python 2.7 中文字符匹配搜索及編碼轉換

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