Python正则表达式,删除除unhenode字符串的连字符之外的所有标点符号

时间:2014-01-18 19:48:02

标签: python regex string

我有这段代码用于删除正则表达式字符串中的所有标点符号:

import regex as re    
re.sub(ur"\p{P}+", "", txt)

如何更改它以允许连字符?如果你能解释一下你是怎么做到的,那就太好了。我明白在这里,如果我错了,请纠正我,在标点后加上任何东西。

3 个答案:

答案 0 :(得分:22)

[^\P{P}-]+

\P\p的补充 - 不是标点符号。所以这匹配(不是标点符号或破折号)的任何内容 - 导致除破折号之外的所有标点符号。

示例:http://www.rubular.com/r/JsdNM3nFJ3

如果你想要一种非复杂的方式,另一种选择是\p{P}(?<!-):匹配所有标点符号,然后检查它不是破折号(使用负向后观)。
工作示例:http://www.rubular.com/r/5G62iSYTdk

答案 1 :(得分:14)

以下是re模块的使用方法,以防您必须坚持使用标准库:

# works in python 2 and 3
import re
import string

remove = string.punctuation
remove = remove.replace("-", "") # don't remove hyphens
pattern = r"[{}]".format(remove) # create the pattern

txt = ")*^%{}[]thi's - is - @@#!a !%%!!%- test."
re.sub(pattern, "", txt) 
# >>> 'this - is - a - test'

如果效果很重要,您可能需要使用str.translate,因为it's faster than using a regex。在Python 3中,代码为txt.translate({ord(char): None for char in remove})

答案 2 :(得分:0)

您可以指定要手动删除的标点符号,如[._,]或提供函数而不是替换字符串:

re.sub(r"\p{P}", lambda m: "-" if m.group(0) == "-" else "", text)