目前正在使用re.sub(re.escape("andrew)"), "SUB", stringVar)
预期行为:
stringVar = " andrew) "
re.sub(re.escape("andrew)"), "SUB", stringVar) # Returns " SUB "
意外行为:
stringVar = "zzzandrew)zzz"
re.sub(re.escape("andrew)"), "SUB", stringVar) # Returns "zzzSUBzzz"
因此我尝试使用单词边界来修复“zzzandrew)zzz”,但是我的修复打破了我的基本情况。
stringVar = " andrew) "
re.sub(r'\b%s\b' % re.escape("andrew)"), "SUB", stringVar) # Breaks and returns the original stringVar
来自:https://docs.python.org/2.0/ref/strings.html - >原始字符串并对反斜杠转义序列使用不同的规则。那么除了re.escape我该怎么办?
答案 0 :(得分:1)
来自python re
模块docs
\ B'/ P>
匹配空字符串,但仅匹配单词的开头或结尾。 一个单词被定义为一个字母数字或下划线字符序列, 所以一个单词的结尾用空格或非字母数字表示, 非下划线的角色。请注意,正式地,\ 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),则匹配#39;
>>> 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'