中文文本中可能出現的標點符號來源比較複雜,經過匹配等手段對他們處理的時候須要格外當心,防止遺漏。如下爲在下處理中文標點的時候採用的兩種方法,若有更好的工具,請推薦補充。php
!?。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛「」„‟…‧﹏.
zhon.hanzi.punctuation
函數便可獲得這些中文標點。string.punctuation
函數可獲得: !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~
>>> import re >>> from zhon.hanzo import punctuation >>> line = "測試。。去除標點。。" >>> print re.sub(ur"[%s]+" %punctuation, "", line.decode("utf-8")) # 須要將str轉換爲unicode 測試去除標點 >>> print re.sub(ur"[%s]+" %punctuation, "", line) #將不會發生替換 測試。。去除標點。。
固然,若是想去除重複的符號而只保留一個,那麼能夠用\1
指明:好比python
>>> re.sub(ur"([%s])+" %punctuation, r"\1", line.decode("utf-8"))
若是不是用的zhon包提供的已是unicode碼的標點集,而是本身定義,那麼請不要忘了轉換成unicode碼:網絡
punc = "!?。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛「」„‟…‧﹏." punc = punc.decode("utf-8")
Basic Latin: u'\u0020' - u'\007f' general punctuation: u'\u2000' - u'\u206f' CJK Symbols and Punctuation: u'\u3000' - u'\u303f' halfwidth and fulllwidth forms: u'\uff00' - u'\uffef'
在用u'\u0020-\u007f\u2000-\u206f\u3000-\u303f\uff00-uffef'
替換punctuation
就能實現上述操做。
PS:中文經常使用字符的範圍是u'\u4e00' - u'\u9fff'
。匹配因此中文能夠這樣:函數
re.findall(ur"\u4e00-\u9fff", line)
小結:工具
參考:測試