来自蟒蛇re
module docs
\b
匹配空字符串,但仅匹配单词的开头或结尾。
单词被定义为字母数字或下划线字符的序列,
因此单词的结尾由空格或非字母数字表示,
非下划线字符。请注意,正式地,\b 被定义为
\w 和 \W 字符之间的边界(反之亦然),或 \w 之间的边界
以及字符串的开头/结尾,因此精确的字符集
是否被视为字母数字取决于 UNICODE 的值和
LOCALE 标志。例如,r'\bfoo\b' 匹配 'foo'、'foo.'、'(foo)'、
'酒吧
foo baz' 但不是 'foobar' 或 'foo3'。
在您的情况下,单词边界被识别为 andrew 和 ) 之间,它是第一个非字母数字非下划线字符。下面的示例说明了如果在转义中包含或排除“)”会发生什么情况。
>>> stringVar = " andrew) "
>>> re.sub(r'\b%s\b' % re.escape("andrew)"), "SUB", stringVar)
' andrew) '
>>> re.sub(r'\b%s\b' % re.escape("andrew"), "SUB", stringVar)
' SUB) '
>>> stringVar = "zzzandrew)zzz"
>>> re.sub(r'\b%s\b' % re.escape("andrew"), "SUB", stringVar)
'zzzandrew)zzz'
如果您必须使用 ')' 作为转义的一部分,您可以使用积极的前瞻断言如下所示,如果 'andrew)' 之后有空格 (\s) 或非字母数字字符 (\W),则匹配
>>> stringVar = " andrew) "
>>> re.sub(r'\b%s(?=\s)' % re.escape("andrew)"), "SUB", stringVar)
' SUB '
>>> stringVar = "zzzandrew)zzz"
>>> re.sub(r'\b%s(?=\s)' % re.escape("andrew)"), "SUB", stringVar)
'zzzandrew)zzz'
>>> stringVar = " andrew) "
>>> re.sub(r'\b%s(?=\W)' % re.escape("andrew)"), "SUB", stringVar)
' SUB '
>>> stringVar = "zzzandrew)zzz"
>>> re.sub(r'\b%s(?=\W)' % re.escape("andrew)"), "SUB", stringVar)
'zzzandrew)zzz'