我希望它只匹配每个单词的结尾
示例:
"i am test-ing., i am test.ing-, i am_, test_ing,"
输出应该是:
"i am test-ing i am test.ing i am test_ing"
答案 0 :(得分:5)
>>> import re
>>> test = "i am test-ing., i am test.ing-, i am_, test_ing,"
>>> re.sub(r'([^\w\s]|_)+(?=\s|$)', '', test)
'i am test-ing i am test.ing i am test_ing'
匹配一个或多个非字母数字字符([^\w\s]|_
),后跟空格(\s
)或字符串结尾($
)。 (?= )
构造是一个先行断言:它确保匹配中不包含匹配的空格,因此它不会被替换;只有[\W_]+
被替换。
好的,但为什么[^\w\s]|_
,你问?第一部分匹配任何非字母数字或下划线([^\w]
)或空格([^\s]
),即标点字符。除了我们确实想要删除下划线,我们然后包含那些|_
。