Python正则表达式中的反斜杠转义序列和单词边界

时间:2017-12-18 15:52:05

标签: python regex

目前正在使用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我该怎么办?

1 个答案:

答案 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'