Python正则表达式中的反斜杠转义序列和单词边界
问题内容:
目前正在使用 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-
原始字符串,并对反斜杠转义序列使用不同的规则。那么,除了重新逃生我该怎么办?
问题答案:
来自pythonre
模块文档
\ b
匹配空字符串,但仅在单词的开头或结尾处匹配。单词被定义为字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字的非下划线字符指示。请注意,正式地,\
b被定义为\ w和\ W字符之间的边界(反之亦然),或者\
w与字符串的开头/结尾之间的边界,因此被视为字母数字字符的精确字符集取决于在UNICODE和LOCALE标志的值上。例如,r’\ bfoo \
b’匹配’foo’,’foo。’,’(foo)’,’bar foo baz’,但不匹配’foobar’或’foo3’。
在这种情况下,单词border被识别为在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'