re模块的正则表达式支持单词边界(\b)吗?

132 投票
5 回答
76672 浏览
提问于 2025-04-16 05:54

在学习正则表达式的时候,有个教程提到可以用 \b 来匹配单词的边界。不过,在Python的解释器里,下面这段代码却没有按预期工作:

>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)

如果有匹配到内容的话,应该会返回一个匹配对象,但结果却是 None

难道 \b 这个表达式在Python里不支持,还是我用错了?

5 个回答

25

我来给你解释一下为什么 re.search("\btwo\b", x) 这个写法不管用。其实是因为在 Python 里,\b 代表的是一个退格符,也就是删除前一个字符的意思。

print("foo\bbar")
fobar

所以这个模式 "\btwo\b" 实际上是在找一个退格符,后面跟着 two,再后面又跟着一个退格符。而你要查找的字符串 x = 'one two three' 里根本没有退格符。

如果你想让 re.search(或者 compile)把 \b 识别为单词的边界,你可以把反斜杠加倍(变成 "\\btwo\\b"),或者使用原始字符串来创建你的模式(写成 r"\btwo\b")。

109

这个方法可以用:re.search(r"\btwo\b", x)

在Python中,写"\b"其实是一个单独的字符:"\x08"。你可以用下面的方式来处理反斜杠:

"\\b"

或者你也可以像这样写一个原始字符串:

r"\b"
118

你在写代码的时候,应该使用原始字符串

>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>> 

另外,为什么不试试这个呢?

word = 'two'
re.compile(r'\b%s\b' % word, re.I)

输出结果:

>>> word = 'two'
>>> k = re.compile(r'\b%s\b' % word, re.I)
>>> x = 'one two three'
>>> y = k.search( x)
>>> y
<_sre.SRE_Match object at 0x100418850>

撰写回答