在尝试学习更多有关正则表达式的内容时,教程建议您可以使用它\b
来匹配单词边界.但是,Python解释器中的以下代码段无法按预期工作:
>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)
Run Code Online (Sandbox Code Playgroud)
它应该是一个匹配对象,如果匹配任何东西,但它是None
.
是\b
不是在Python支持或正在使用它错了,我的表达?
Bol*_*olo 81
这将有效: re.search(r"\btwo\b", x)
当你用"\b"
Python 编写时,它是一个单个字符:"\x08"
.要么像这样逃避反斜杠:
"\\b"
Run Code Online (Sandbox Code Playgroud)
或写一个像这样的原始字符串:
r"\b"
Run Code Online (Sandbox Code Playgroud)
pyf*_*unc 78
你为什么不试试
word = 'two'
re.compile(r'\b%s\b' % word, re.I)
Run Code Online (Sandbox Code Playgroud)
输出:
>>> 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>
Run Code Online (Sandbox Code Playgroud)
也忘了提一下,你应该在你的代码中使用原始字符串
>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>>
Run Code Online (Sandbox Code Playgroud)
Bil*_*ard 16
只是为了明确解释为什么 re.search("\btwo\b", x)
不起作用,这是因为\b
在Python字符串中是退格字符的简写.
print("foo\bbar")
fobar
Run Code Online (Sandbox Code Playgroud)
所以模式"\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的字符串文字兼容.