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'),我如何让正则表达式释放第一部分的匹配? 我尝试过负面的预测,但无济于事。这场比赛根本没有返回任何内容,或者只用了相同的结果......
答案 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 ')]