来自re模块的Python正则表达式是否支持单词边界(\ b)?

时间:2010-10-22 08:21:37

标签: python regex

在尝试学习更多有关正则表达式的内容时,教程建议您可以使用\b来匹配单词边界。但是,Python解释器中的以下代码段无法按预期工作:

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

如果匹配任何内容,它应该是匹配对象,但它是None

Python中不支持\b表达式,或者我使用它是错误的吗?

4 个答案:

答案 0 :(得分:73)

这将有效:re.search(r"\btwo\b", x)

在Python中编写"\b"时,它是一个单个字符:"\x08"。要么像这样逃避反斜杠:

"\\b"

或写一个这样的原始字符串:

r"\b"

答案 1 :(得分:72)

你为什么不试试

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>

也忘了提一下,你应该在你的代码中使用原始字符串

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

答案 2 :(得分:9)

Python文档

https://docs.python.org/2/library/re.html#regular-expression-syntax

  

\ B'/ P>      

匹配空字符串,但仅匹配单词的开头或结尾。单词被定义为字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字的非下划线字符表示。请注意,正式地,\ b被定义为\ w和\ W字符之间的边界(反之亦然),或者在\ w和字符串的开头/结尾之间,因此被认为是字母数字的精确字符集取决于关于UNICODE和LOCALE标志的值。例如,r&#39; \ bfoo \ b&#39;匹配&#39; foo&#39;,&#39; foo。&#39;,&#39;(foo)&#39;,&#39; bar foo baz&#39;但不是&#39; foobar&#39;或者&#39; foo3&#39;。在字符范围内,\ b表示退格符,以便与Python的字符串文字兼容。

答案 3 :(得分:9)

只是为了明确解释为什么 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")。