当休息不适合但只适合第一部分的下一场比赛后,我怎么能让正则表达式放弃第一部分的比赛?

时间:2017-09-01 09:05:33

标签: python regex python-3.x

regexp中有一种奇怪的“贪婪”行为: 使用我的搜索模式:

r'\/begin FUNC\s+(\w*).*?\/begin DEF_VAR\s*([\w .\s]*)\s*\/end DEF_VAR.*?\/end FUNC' 

用re.S来制作'。'匹配换行符。测试字符串为:

/begin FUNC
    WDHOL

/end FUNC

/begin FUNC
    AMROTL
    /begin DEF_VAR
        KFMELO
    /end DEF_VAR
/end FUNC

匹配将返回['WDHOL','KFMELO \ n \ t']而不是预期的['AMROTL','KFMELO \ n \ t']。 当第一部分再次出现时(或'/ end FUNC'),我如何让正则表达式释放第一部分的匹配? 我尝试过负面的预测,但无济于事。这场比赛根本没有返回任何内容,或者只用了相同的结果......

2 个答案:

答案 0 :(得分:1)

使用以下方法:

s = '''
/begin FUNC
    WDHOL

/end FUNC

/begin FUNC
    AMROTL
    /begin DEF_VAR
        KFMELO
    /end DEF_VAR
/end FUNC'''

pat = re.compile('/begin FUNC\s*(\S+)\s*/begin DEF_VAR\s*(\S+)\s*/end DEF_VAR\s*/end FUNC')
result = pat.findall(s, re.DOTALL)
print(result)

输出:

[('AMROTL', 'KFMELO')]

答案 1 :(得分:1)

您可以使用否定前瞻:

s = '''/begin FUNC
    WDHOL

/end FUNC

/begin FUNC
    AMROTL
    /begin DEF_VAR
        KFMELO
    /end DEF_VAR
/end FUNC'''

pat = re.compile(r'(?:\/begin FUNC)\s+(\w*)(?!.*?\1)\s+\/begin DEF_VAR\s*([\w .\s]*)\s*\/end DEF_VAR.*?\/end FUNC', re.S)

pat.findall(s)

输出:

[('AMROTL', 'KFMELO\n ')]