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','') ('','') ('', '任何') ('','') ('上', '') ('','') ('','任何')
('','')
在
任何
在
任何
在互联网和S.O.上阅读了很多文章。我想我仍然不理解正则表达式边界:\b
第一个正则表达式没有给我预期的结果我认为它必须给我“ON Any On Any”但它仍然没有给我那个。
第二个正则表达式给了我元组,我不知道为什么或理解它的含义:('','')
第三个正则表达式给出了分隔线上的结果和两者之间的空行
请你帮我理解一下。
答案 0 :(得分:1)
请注意,要匹配ON ANY
,您需要在re.VERBOSE
和ON
之间添加一个转义(因为您使用的是ANY
标记)空格\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)
返回元组,因为您在模式中定义了(...)
捕获组。
re.compile(r'''\b(?:ON)?\b(?:Any)?''', re.VERBOSE)
匹配可选序列,ON
或Any
,因此您可以将这些字词作为值。你也得到空值,因为这个正则表达式只能匹配一个单词边界(所有其他子模式都是可选的)。
关于字边界的更多细节: