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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值