Python正则表达式边界带有意外结果

时间:2016-10-05 13:41:22

标签: python regex word-boundary

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”但它仍然没有给我那个。

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

第三个正则表达式给出了分隔线上的结果和两者之间的空行

请你帮我理解一下。

1 个答案:

答案 0 :(得分:1)

请注意,要匹配ON ANY,您需要在re.VERBOSEON之间添加一个转义(因为您使用的是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)匹配可选序列,ONAny,因此您可以将这些字词作为值。你也得到空值,因为这个正则表达式只能匹配一个单词边界(所有其他子模式都是可选的)。

关于字边界的更多细节: