1. 程式人生 > >python 匹配文字全形轉半形字元

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

總的來說 兩種方法都還是有必要存在的。

第二種方法簡單直接 如果能快速方便列出所有形式的待匹配符號,就果斷選用第二個

反之,若待匹配的各種符號太多太繁瑣,就統一轉為半形再處理更好