正则表达式中意外的单词边界行为

时间:2017-06-08 15:39:11

标签: python regex python-3.x

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如何解决?

2 个答案:

答案 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点代表的字符 在这种情况下,它在目标中找到文字点.,然后是边界
期望下一个字符是一个单词。

因此,在第二种情况下,目标在点之后有一个空格,即为 一个字。因此,没有匹配。