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

2023-11-29

目前使用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

From: https://docs.python.org/2.0/ref/strings.html-> 原始字符串并对反斜杠转义序列使用不同的规则。那么除了re.escape我还应该做什么呢?


来自蟒蛇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'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐