s = '!sopa !sop !sopaa !sopii'
使用字边界时如何忽略!
re.sub(r'\b\!sop\b', 'sopa', s)
输出:'!sopa !sop !sopaa !sopii'
答案 0 :(得分:2)
好像你想要这样的东西。
>>> s = '!sopa !sop !sopaa !sopii'
>>> re.sub(r'\B!sop\b', 'sopa', s)
'!sopa sopa !sopaa !sopii'
您的正则表达式会失败,因为\b
符号之前没有!
实际退出。也就是说,从上面开始,只有当!
符号前面有非单词字符时,才会尝试匹配\b
符号。 \B
匹配单词char和非单词字符,反之亦然。 \B
匹配两个单词和两个非单词字符。此处!
在空格和{{1}}之间存在,因为两者都是非单词字符。
答案 1 :(得分:1)
(?:^|(?<= ))!sop\b
你可以简单地使用它。参见演示。
https://regex101.com/r/bW3aR1/12#python
re.sub(r'(?:^|(?<= ))!sop\b', 'sopa', s)
用于动态字符串使用
replace = 'sop'
s = '!sopa !sop !sopaa !sopii'
print re.sub(r"(?:^|(?<= ))!" +replace +r"\b", "new", s)
答案 2 :(得分:-1)
搜索非字母数字字符并替换为空格:
re.sub('\W+',' ',s)
'sopa sopa sopa sopa'