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

D.C*_*.C. 91 python regex

在尝试学习更多有关正则表达式的内容时,教程建议您可以使用它\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)

  • 这真的对我很有帮助......我正在努力学习一个pyspark rlike正则表达式,并且无法弄清楚为什么\ b(单词边界)不起作用.谢谢 (4认同)

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)

  • -1:向后.原始字符串应该是第一个.使用字符串'%`替换构建re表达式的另一个业务是一个坏的切线,与这个特定的问题无关. (9认同)
  • 答案不好.代码有效,但没有任何解释. (2认同)

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").


Cir*_*四事件 9

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