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的文本点,然后是边界
期望下一个字符是一个单词。
因此,在第二种情况下,目标在点之后有一个空格,即
一言不发。因此,没有匹配。