pythonテキストの全角記号を一致させる2つの方法

1432 ワード

テキストを処理するとき、カッコと句読点を一致させることがよくあります.
一般的な英語(半角)記号は()のように直接正則で一致すればよい.
ただし、全角文字(中国語括弧、句読点)に遭遇した場合、直接正則で一致すると問題が発生します.
符号化は通常utf 8であるため、直接一致すると、中国語カッコの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

どちらの方法も必要だ.
2つ目の方法は簡単で、すべての形式の一致する記号をすばやく簡単にリストできる場合は、2つ目を断固として選択します.
逆に,マッチングされる各種記号が多すぎて煩雑であれば,半角に統一して処理したほうがよい.