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


100

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

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

如果有任何匹配项,它应该是一个匹配对象,但它是None

\bPython不支持该表达式吗?或者我使用的是错误的?


31
这将起作用:re.search(r"\btwo\b", x)
Bolo

5
为什么不使用“原始”字符串? r"\btwo\b"
S.Lott

3
人们经常混淆有关\b
tchrist

是的, Python确实需要,您只需要原始字符串即可r'\b'使字符转义。(或者两次转义它\\b,这是yukky)
smci

Answers:


85

你为什么不尝试

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>
>>> 

有趣,感谢您的工作示例。您对我选择的方法为何行不通有什么见解?两种方法应该相同,除了在您的方法中只编译一次。
DC

1
@darren:看看我的最后一个示例,它只是在改进您所做的事情。我提供了原始字符串进行搜索。
pyfunc

1
在您和Bolo的建议之后,是因为我没有使用原始字符串。谢谢!
DC

9
-1:向后。原始字符串应该是第一个。使用字符串%替换构建re表达式的另一项工作是切线,与该特定问题无关。
S.Lott

2
错误的答案。该代码有效,但是没有任何解释。
阿兰·菲

88

这将起作用: re.search(r"\btwo\b", x)

"\b"用Python 编写时,它是一个字符:"\x08"。可以这样逃避反斜杠:

"\\b"

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

r"\b"

4
这确实对我有所帮助。。。谢谢
jb1t

17

只是为了明确解释为什么 re.search("\btwo\b", x)不起作用,这是因为\b在Python字符串中,Backspace字符是简写形式。

print("foo\bbar")
fobar

因此,模式"\btwo\b"正在寻找一个空格,其次是two,之后是另一个空格,您在(x = 'one two three')中搜索的字符串没有空格。

要允许re.search(或compile)将序列解释\b为单词边界,请转义反斜杠("\\btwo\\b")或使用原始字符串创建模式(r"\btwo\b")。


10

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的字符串文字兼容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.