import re
text = 'washington d.c. columbia'
templ_1 = 'washington d.c'
templ_2 = 'washington d.c.'
print(re.sub(r'\b%s\b'%templ_1, '', text))
我按预期得到了. columbia
print(re.sub(r'\b%s\b'%templ_2, '', text))
我得到washington d.c. columbia
而不是. columbia
如何解决?
答案 0 :(得分:1)
\b
描述了从单词到非单词字符的转换。后跟.
的{{1}}不是这样的转换(也不是单词字符)。此外,您需要将字符串添加到正则表达式,或
re.escape
s匹配任何字符,而不是文字.
。
可能的解决方法是:
.
使用前瞻断言,你的模式后跟一个空格或字符串的结尾,而不是单词边界(因为你的模式可能不会以单词字符结尾)。使用print(re.sub(r'\b%s(?=\s|$)'%re.escape(templ_2), '', text))
代替\W
也是合理的。
答案 1 :(得分:1)
字边界是从单词到非单词,或从非单词到单词的过渡。
在您的情况下,您根据下一个文字固定了该过渡
到边界构造\b
在第一个正则表达式\bwashington d.c\b
中
在c
之后的意思是它期望一个非单词。
在第二个正则表达式\bwashington d.c.\b
中
在这种情况下,.
之后的含义是未定义的,直到找到
为止
由metachar点代表的字符
在这种情况下,它在目标中找到文字点.
,然后是边界
期望下一个字符是一个单词。
因此,在第二种情况下,目标在点之后有一个空格,即为 不一个字。因此,没有匹配。