1. 程式人生 > >python的正則匹配unicode

python的正則匹配unicode

  最近用到python的正則表示式解析不同的語言,發現有不少細節很困擾人,寫下來留念。

  python正則解析unicode的注意點。一是pattern前需要加u來escape unicode,而是源字串也得是unicode。因此,一個解析unicode的語句應該這樣寫

re.sub(ur'.*[\u4E00-\u9FA5]+.*', '', unicode('中文'))

  對於英文,中文,日文,韓文,常見的unicode字元範圍如下

epre = re.compile(r"[\s\w]+")
chre = re.compile(ur".*[\u4E00-\u9FA5]+.*")
jpre = re.compile(ur".*[\u3040-\u30FF\u31F0-\u31FF]+.*")
hgre = re.compile(ur".*[\u1100-\u11FF\u3130-\u318F\uAC00-\uD7AF]+.*")
  對於更細緻的unicode範圍,請參考這裡http://www.iteye.com/topic/558050

  對於正則主要的幾個函式match,search,split,findall,sub

  對於複雜的正則式,可以用repr()來檢視原始字串

  另外,如果需要替換所有標點,python的寫法也有些不一樣

re.sub(r'[{}]+'.format(string.punctuation),'', name)
  java裡可以這樣寫
name.replaceAll("[\\pP‘’“”]", "");

  對於不確定的編碼,使用chardet來猜測編碼方式也不失為一種選擇

def autoTransformEncoding(x):
    if(x == None or x == ''):
        return ''
    defaultEncoding = sys.getdefaultencoding()
infoencode = chardet.detect(x).get('encoding', defaultEncoding) if(infoencode == None): infoencode = defaultEncoding return x.decode(infoencode,'ignore').encode('utf-8')