Python 正则表达式边界出现意外结果

Python regex words boundary with unexpected results

import re
sstring = "ON Any ON Any"
regex1 = re.compile(r''' \bON\bANY\b''', re.VERBOSE)
regex2 = re.compile(r'''\b(ON)?\b(Any)?''', re.VERBOSE)
regex3 = re.compile(r'''\b(?:ON)?\b(?:Any)?''', re.VERBOSE)
for a in regex1.findall(sstring): print(a)
print("----------")
for a in regex2.findall(sstring): print(a)
print("----------")
for a in regex3.findall(sstring): print(a)
print("----------")

('ON', '') ('', '') ('', 'Any') ('', '') ('ON', '') ('', '') ('', 'Any')

('', '')

ON

Any

ON

Any


在互联网上阅读了很多文章 S.O。我想我还是不明白正则表达式的词边界:\b

第一个正则表达式没有给我预期的结果我认为它必须给我 "ON Any On Any" 但它仍然没有给我那个。

第二个正则表达式给了我元组,我不知道为什么或不理解以下的含义:('', '')

第三个正则表达式在分隔行和中间的空行上打印结果

你能帮我理解一下吗。

请注意,要匹配 ON ANY,您需要在 ONANY 之间添加转义(因为您使用的是 re.VERBOSE 标志)space 作为\b 字边界 作为 零宽度断言 不消耗任何文本,只是断言特定字符之间的位置。这就是您第一次 re.compile(r''' \bON\bANY\b''', re.VERBOSE) 方法失败的原因。

使用

rx = re.compile(r''' \bON\ ANY\b ''', re.VERBOSE|re.IGNORECASE)

Python demo

re.compile(r'''\b(ON)?\b(Any)?''', re.VERBOSE)returns 元组,因为您在模式中定义了(...)捕获组

re.compile(r'''\b(?:ON)?\b(?:Any)?''', re.VERBOSE) 匹配可选序列,ONAny,因此您将这些词作为值。您也会得到空值,因为此正则表达式只能匹配单词边界(所有其他子模式都是可选的)。

关于单词边界的更多详细信息: