为什么\b在这个正则表达式中不被解释为反斜杠

1 投票
2 回答
40 浏览
提问于 2025-04-12 04:22

这是我的代码:

import re
string = "hello\bworld"
reg = r"\bhello\b"
print(re.findall(reg, string))

输出是:

   ['hello']

但这让我有点困惑。
在官方的Python 文档中,\b被描述为Python和正则表达式转义序列之间最糟糕的冲突:

这是Python字符串字面量和正则表达式序列之间最糟糕的冲突。在Python的字符串字面量中,\b是退格字符,ASCII值为8。如果你没有使用原始字符串,那么Python会把\b转换成退格,这样你的正则表达式就不会像你预期的那样匹配了。

在Python中,\b被解释为退格字符,所以string会被转换成hellworld

print(string)

输出是:

hellworld

而在正则表达式中,\b被解释为单词边界。
所以在hellworld中搜索模式r"\bhello\b"理论上应该返回0个匹配项。
因为在hellworld中没有任何“hello”是被单词边界包围的。

我原本期待结果是一个空列表。

另一种看待这个问题的方法是用这段代码:

import re
string = "hello\bworld"
reg = r"hellw"
print(re.findall(reg, string))

这里的输出是:

[]

这让我再次感到困惑,因为在字符串string中确实有一个hellw。
打印string可以证明这一点:

print(string)
hellw

我到底没有看到什么呢?

2 个回答

2

'hello\bworld'hellworld 的转换其实不是由 Python 自己完成的,而是由 你的终端 来处理的。首先打印出单词 hello,然后当打印出退格符时,光标向左移动一个空格,接着在原来 o 的位置上打印 w

因为实际的字符串中在 helloworld 之间多了一个字符(退格符),所以搜索 hellw 是不会匹配的,而搜索 hello 作为一个独立的单词(也就是说,前后没有其他有效字符) 会匹配的。

2

退格键并不会改变字符串的内容,它只是影响字符串在终端上显示的方式。这个字符串里有一个字母o,后面跟着一个退格键。因为o是一个字母,而退格键算是一个非字母字符,所以它们之间有一个断开的位置。因此,在正则表达式中,\b就可以在这里匹配到。

撰写回答