在尝试学习更多关于正则表达式的知识时,一个教程建议使用\b
来匹配单词边界。然而,在Python解释器中运行的以下代码片段未能按预期工作:
>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)
如果有任何匹配,它应该是一个匹配对象,但它却是None
。
\b
表达式在Python中不支持吗,还是我使用错误了?
在尝试学习更多关于正则表达式的知识时,一个教程建议使用\b
来匹配单词边界。然而,在Python解释器中运行的以下代码片段未能按预期工作:
>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)
如果有任何匹配,它应该是一个匹配对象,但它却是None
。
\b
表达式在Python中不支持吗,还是我使用错误了?
你的代码中应该使用原始字符串
>>> 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表达式的其他业务是一个不相关的坏方向,与这个特定问题无关。 - S.Lott这个可以正常工作:re.search(r"\btwo\b", x)
在Python中,当你写"\b"
时,它是一个单字符:"\x08"
。你需要转义反斜杠像这样:
"\\b"
或者像这样编写原始字符串:
r"\b"
\d
不需要原始字符串就可以正常工作,而\b
却不行呢? - Quinn Comendant为了明确解释为什么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"
)。
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 字符串文字兼容。
注意,对于动态变量,这种方法不起作用。
x = 'one two three'
dy = "two"
y = re.search(r"\b" + dy + "\b", x)
print(y) # None
在左右两边使用 r"\b"
x = 'one two three'
dy = "two"
y = re.search(r"\b" + dy + r"\b", x)
print(y) # <re.Match object; span=(4, 7), match='two'>
re.search(r"\btwo\b", x)
。 - Bolor"\btwo\b"
? - S.Lott\b
感到困惑。 - tchristr'\b'
来转义该字符。(否则就要双重转义\\b
,这很麻烦) - smci