最近用到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')