re模块的正则表达式支持单词边界(\b)吗?
在学习正则表达式的时候,有个教程提到可以用 \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>