Python处理中文标点符号大集合
本文介绍在Python中处理中文标点符号的多种方法,包括利用zhon库获取标准标点集合、使用正则表达式去除或保留单个标点、通过Unicode范围过滤字符,以及结合translate与split实现多符号分割。内容涵盖半角全角处理及函数封装,适用于文本清洗与自然语言预处理场景。
中文文本中的标点符号来源多样,处理时若仅依赖简单匹配容易遗漏,需谨慎操作。以下介绍两种常用的中文标点处理方案:
中文标点集合
常见的中文标点符号包括:
!?。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘'‛“”„‟…‧﹏.
通过调用zhon包的zhon.hanzi.punctuation函数,即可获取上述中文标点列表。
若需处理英文标点,可调用string包的string.punctuation函数,结果如下:
!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~
因此,若需去除所有标点符号,可执行以下操作:
>>> import re
>>> from zhon.hanzo import punctuation
>>> line = "测试。。去除标点。。"
>>> print re.sub("[{}]+".format(punctuation), "", line.decode("utf-8")) # 需要将str转换为unicode
若希望去除重复标点并仅保留一个,可使用\1进行指代,例如:
>>> re.sub(ur"([{}])+".format(punctuation), "\1", line.decode("utf-8"))
也可以手动指定所需的标点符号列表。
punctuation = """!?。"#$%&'()*+-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘'‛“”„‟…‧﹏"""
re_punctuation = "[{}]+".format(punctuation)
line = re.sub(re_punctuation, "", line)
通过直接指定Unicode码范围的方式,可以实现strip操作,例如:
去除所有半角和全角符号,仅保留字母、数字及中文字符。
def remove_punctuation(line):
rule = re.compile(ur"[^a-zA-Z0-9\u4e00-\u9fa5]")
line = rule.sub('',line)
return line
汉字的Unicode范围是“\u4e00-\u9fa5”,由于涉及Unicode表示,前缀必须为“u”;字符“r”表示原始字符串,忽略后续转义字符,从而简化正则表达式中每个转义字符需单独转义的繁琐操作。
最后,可将上述逻辑组合为一个完整函数。
def remove_punctuation(line, strip_all=True):
if strip_all:
rule = re.compile(ur"[^a-zA-Z0-9\u4e00-\u9fa5]")
line = rule.sub('',line)
else:
punctuation = """!?。"#$%&'()*+-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘'‛“”„‟…‧﹏"""
re_punctuation = "[{}]+".format(punctuation)
line = re.sub(re_punctuation, "", line)
return line.strip()
清洗完成后,有时需要依据多种标点符号对文本进行分割。
例如,只要遇到中文或英文的逗号、句号等符号即进行分割,可直接利用translate将这些符号统一映射为分隔符,再执行split:
strip_chars = '?"。.,,《》[]〖〗“”'
single_line = single_line.translate(str.maketrans(dict.fromkeys(strip_chars, '#')))
single_line = single_line.split('#')
总结
以上介绍了Python处理中文标点符号的多种方法,希望能为读者提供帮助。如有疑问欢迎留言,小编将及时回复。感谢大家对本站的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









