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


import re
text = 'washington d.c. columbia'
templ_1 = 'washington d.c'
templ_2 = 'washington d.c.'
print(re.sub(r'b%sb'%templ_1, '', text))

我如预期的那样得到了. columbia

print(re.sub(r'b%sb'%templ_2, '', text))

我得到了washington d.c. columbia而不是. columbia 如何解决它?

b描述了从单词字符到非单词字符的转换。后跟 a . 不是这样的转换(单词字符也不是(。此外,您需要.将字符串添加到正则表达式中,否则.将匹配任何字符,而不是文字W s。

可能的解决方法是:

print(re.sub(r'b%s(?=s|$)'%re.escape(templ_2), '', text))

使用前瞻断言,即模式后跟空格或字符串末尾,而不是单词边界(因为模式可能不以单词字符结尾(。使用s而不是b也是合理的。

单词边界是从单词到非单词,或从非单词到单词的过渡。

在您的情况下,您根据下一个
文本的内容修复了该转换到边界构造bwashington d.cb

在第一个正则表达式中,它的c
意思是bwashington d.c.b之后它期望一个非单词。

在第二个正则表达式中,它的.
在这种情况下,.后的含义是不确定的,直到它找到
由元字符点表示的字符。
在这种情况下,它会在目标中找到CC_17的文本点,然后是边界
期望下一个字符是一个单词。

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

最新更新