Backslash逃脱序列和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%sb' % re.escape("andrew)"), "SUB", stringVar) # Breaks and returns the original stringVar

来自:https://docs.python.org/2.0/ref/strings.html->原始字符串,并使用不同的规则对Backslash Escape sequences进行使用。那么除了re.eScape,我该怎么办?

来自python re模块doc

b

匹配空字符串,但仅在单词的开头或结尾处。 一个单词定义为字母数字或下划线字符的序列, 因此,单词的结尾由whitespace或非all-alphanumeric表示, 非输入性字符。请注意,正式, b定义为 w和 w字符(反之亦然)或 w之间的边界 和字符串的开始/结尾,因此精确的字符集 被认为是字母数字取决于Uncode的值和 语言环境旗。例如,r' bfoo b'匹配'foo','foo。','(foo)',',','(foo)', '酒吧 foo baz'但不是" foobar"或" foo3"。

在您的情况下,单词边界在安德鲁(Andrew)和)之间被认为是第一个非alphanumeric not-underscore字符。下面的示例说明了从逃生中包括或排除')时会发生什么。

>>> stringVar = " andrew) "
>>> re.sub(r'b%sb' % re.escape("andrew)"), "SUB", stringVar)
' andrew) '
>>> re.sub(r'b%sb' % re.escape("andrew"), "SUB", stringVar)
' SUB) '
>>> stringVar = "zzzandrew)zzz"
>>> re.sub(r'b%sb' % re.escape("andrew"), "SUB", stringVar)
'zzzandrew)zzz'

如果您必须使用')'作为逃生的一部分( w)'andrew)'

之后
>>> 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'