在對文字進行處理的時候經常會遇見要對括號和標點進行匹配
常見的英文(半形)符號如( ) 直接用正則匹配即可
但是遇見全形字符(中文括號、標點),直接用正則匹配會存在問題:
因為編碼通常為為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
總的來說 兩種方法都還是有必要存在的。
第二種方法簡單直接 如果能快速方便列出所有形式的待匹配符號,就果斷選用第二個
反之,若待匹配的各種符號太多太繁瑣,就統一轉為半形再處理更好
全形轉半形 半形轉全形(Python)
coding utf 8 def str q2b u string 全形轉半形 全形字符unicode編碼從65281 65374 十六進製制 0xff01 0xff5e 半形字元unicode編碼從33 126 十六進製制 0x21 0x7e 空格比較特殊,全形為 12288 0x3000 半形為...
全形轉半形與半形轉全形
1.全形 指乙個字元占用兩個標準字元位置。漢字字元和規定了全形的英文本元及國標gb2312 80中的圖形符號和特殊字元都是全形字符。一般的系統命令是不用全形字符的,只是在作文書處理時才會使用全形字符。2.半形 指一字元占用乙個標準的字元位置。通常的英文本母 數字鍵 符號鍵都是半形的,半形的顯示內碼都...
python 全形轉半形
def strq2b ustring 全形轉半形 if not ustring return ustring rstring for uchar in ustring inside code ord uchar if inside code 12288 全形空格直接轉換 inside code 32...