在尝试学习更多关于正则表达式的知识时,一个教程建议您可以使用\b
来匹配单词边界。但是,Python 解释器中的以下代码段无法按预期工作:
>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)
如果有任何匹配,它应该是一个匹配对象,但它是None
.
Python 不支持该\b
表达式还是我用错了?
在尝试学习更多关于正则表达式的知识时,一个教程建议您可以使用\b
来匹配单词边界。但是,Python 解释器中的以下代码段无法按预期工作:
>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)
如果有任何匹配,它应该是一个匹配对象,但它是None
.
Python 不支持该\b
表达式还是我用错了?
您应该在代码中使用原始字符串
>>> 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>
这将起作用:re.search(r"\btwo\b", x)
当你用"\b"
Python 编写时,它是一个字符:"\x08"
. 要么像这样逃避反斜杠:
"\\b"
或者像这样写一个原始字符串:
r"\b"
只是为了明确解释为什么 re.search("\btwo\b", x)
不起作用,这是因为\b
在 Python 中字符串是退格字符的简写。
print("foo\bbar")
fobar
所以该模式"\btwo\b"
正在寻找一个退格,然后是two
,然后是另一个退格,您在 ( x = 'one two three'
) 中搜索的字符串没有。
要允许re.search
(或compile
)将序列解释\b
为单词边界,请转义反斜杠("\\btwo\\b"
)或使用原始字符串来创建模式(r"\btwo\b"
)。
Python 文档
https://docs.python.org/2/library/re.html#regular-expression-syntax
\b
匹配空字符串,但只匹配单词的开头或结尾。单词被定义为字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字、非下划线字符表示。请注意,正式地,\b 被定义为 \w 和 \W 字符之间的边界(反之亦然),或 \w 和字符串的开头/结尾之间的边界,因此被视为字母数字的精确字符集取决于关于 UNICODE 和 LOCALE 标志的值。例如,r'\bfoo\b' 匹配 'foo'、'foo.'、'(foo)'、'bar foo baz' 但不匹配 'foobar' 或 'foo3'。在字符范围内,\b 表示退格字符,以与 Python 的字符串文字兼容。