python 匹配文本全角转半角字符

在对文本进行处理的时候经常会遇见要对括号和标点进行匹配

常见的英文(半角)符号如( ) 直接用正则匹配即可

但是遇见全角字符(中文括号、标点),直接用正则匹配会存在问题:

因为编码通常为为utf8,若直接匹配,中文括号的3字节编码会和一些中文的字节编码重复,产生意想不到的结果

若用decode转为unicode编码,则可避免产生错误结果,但也无法直接用正则匹配到

经过试验,发现一个看上去最佳的解决方法:


将字符串decode之后调用一个将全角符号转为半角符号的方法,然后处理返回的字符串

def strQ2B(ustring):
    """全角转半角"""
    rstring = ""
    for uchar in ustring:
        inside_code=ord(uchar)
        if inside_code == 12288:                              #全角空格直接转换
            inside_code = 32
        elif (inside_code >= 65281 and inside_code <= 65374): #全角字符(除空格)根据关系转化
            inside_code -= 65248
        rstring += unichr(inside_code)
    return rstring

def p(s):
    s1 = strQ2B(s.decode())
    p = re.compile('[()]',re.S)
    s1 = p.sub('',s1)
    return s1

这种方法本质上就是将正则的pattern字符和目标的编码对应, 所以将正则的字符串也用unicode表示就好可以:如下

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding('utf8')
import re

if __name__ == '__main__':
    s = '123(45)a啊速度(伤害)有限公司'
    ss = re.sub(u'[()()]', '', s.decode())
    print ss

总的来说 两种方法都还是有必要存在的。

第二种方法简单直接 如果能快速方便列出所有形式的待匹配符号,就果断选用第二个

反之,若待匹配的各种符号太多太繁琐,就统一转为半角再处理更好




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值