Python处理中⽂标点符号⼤集合
中⽂⽂本中可能出现的标点符号来源⽐较复杂,通过匹配等⼿段对他们处理的时候需要格外⼩⼼,防⽌遗漏。以下为在下处理中⽂标点的时候采⽤的两种⽅法:
中⽂标点集合
⽐较常见标点有这些:
1!?。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆  、、〃》「」『』【】〔〕〖〗    〜〝〞  〾〿–—‘'‛“”…‟…‧﹏.
调⽤zhon包的zhon.hanzi.punctuation函数即可得到这些中⽂标点。
如果想⽤英⽂的标点,则可调⽤string包的string.punctuation函数可得到:1!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~
因此,⽐如需要将所有标点符号去除,可以进⾏以下操作:
1 2 3 4>>> import re
>>> from zhon.hanzo import punctuation
>>> line ="测试。。去除标点。。"
>>> print re.sub("[{}]+".format(punctuation), "", line.decode("utf-8")) # 需要将str转换为unicode
当然,如果想去除重复的符号⽽只保留⼀个,那么可以⽤\1指明:⽐如1>>> re.sub(ur"([{}])+".format(punctuation), "\1", line.decode("utf-8"))你也可以⼿⼯指定这些标点符号
1 2 3punctuation ="""!?。"#$%&'()*+-/:;<=>@[\]^_`{|}~⦅⦆  、、〃》「」『』【】〔〕〖〗    〜〝〞  〾〿–—‘'‛“”…‟…‧﹏"""
re_punctuation ="[{}]+".format(punctuation)
line =re.sub(re_punctuation, "", line)
可以通过直接指定unicode码范围的办法来strip,⽐如:去除所有半⾓全⾓符号,只留字母、数字、中⽂
1 2 3 4def remove_punctuation(line):
rule =repile(ur"[^a-zA-Z0-9\u4e00-\u9fa5]")  line =rule.sub('',line)
return line
汉字的范围为”\u4e00-\u9fa5“,这个是⽤Unicode表⽰的,所以前⾯必须要加”u“;字符”r“的意思是表⽰忽略后⾯的转义字符,这样简化了后⾯正则表达式⾥每遇到⼀个转义字符还得挨个转义的⿇烦
最后可以组合成为⼀个函数
1 2 3 4 5def remove_punctuation(line, strip_all=True):
if strip_all:中文字符unicode查询
rule =repile(ur"[^a-zA-Z0-9\u4e00-\u9fa5]")    line =rule.sub('',line)
else:
5 6 7 8 9  else:
punctuation ="""!?。"#$%&'()*+-/:;<=>@[\]^_`{|}~⦅⦆  、、〃》「」『』【】〔〕〖〗    〜〝〞  〾〿–—‘'‛“”…‟…‧﹏"""
re_punctuation ="[{}]+".format(punctuation)
line =re.sub(re_punctuation, "", line)
return line.strip()
清洗完毕后,有时候我们希望按照多个标点符号来分割
⽐如只要遇到中⽂或英⽂的逗号和句号等符号就分割,可以直接⽤translate把这些符号翻译为统⼀的分隔符,再split:
1 2 3strip_chars ='?"。.,,《》[]〖〗“”'
single_line =anslate(str.maketrans(dict.fromkeys(strip_chars, '#'))) single_line =single_line.split('#')

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。