如何从字符串中每个单词末尾删除特殊字符?

3

我希望它只匹配每个单词的结尾。

例如:

"i am test-ing., i am test.ing-, i am_, test_ing," 

输出应为:
"i am test-ing i am test.ing i am test_ing"
1个回答

6
>>> 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]),即标点符号。但我们确实想要消除下划线,所以我们将其与 |_ 包括在一起。

John:谢谢回复,我想知道$和\Z之间有什么区别? - killown
1
通常(非多行)情况下,有一个区别;$ 会匹配输入字符串的结尾或者字符串末尾的换行符。\Z 只会在字符串的结尾匹配,这通常是期望的行为。 - John Machin
1
更准确地说:在换行符之前或刚好在换行符处。 - John Machin
此解决方案还会删除单词之间多余的空格,这可能是一个无意的(也可能是不希望的)副作用。 - jchl
1
我认为使用 r'([^\w\s]|_)+(?=\s|$)' 可以解决空格删除问题。 - jchl
@jchl 很好的发现。我注意到了,但是认为我可以使用更简单的正则表达式来解决,哈哈。 - John Kugelman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接