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

2024-05-15 00:28:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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如何修复它


Tags: textimportretemplprintwashingtoncolumbia
2条回答

词界是从词到非词或从非词到词的过渡

在您的例子中,您修复了基于下一个文本的转换
到边界构造\b

在第一个正则表达式中,它的\bwashington d.c\b
意思是在c后面,它需要一个非单词

在第二个正则表达式中,它的\bwashington d.c.\b
在这种情况下,.后面的含义在找到
之前是未定义的 元字符点表示的字符。
在本例中,它在目标中找到一个文本点.,然后找到边界
期望下一个字符是单词

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

\b描述从单词字符到非单词字符的转换。一个.后跟一个 is not such a transition (neither is a word character). In addition, you need to re.escape您的字符串被添加到正则表达式中,或者.将匹配任何字符,而不是文字.

可能的解决方法是:

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

使用lookahead断言,您的模式后面是空格或字符串的结尾,而不是单词边界(因为您的模式可能不会以单词字符结尾)。用\W代替\s也是合理的

相关问题 更多 >

    热门问题