Python多行正则表达式贪婪组

时间:2018-03-13 18:44:04

标签: regex regex-greedy

我试图在Python中解析以下示例文本:

Foo 1
foo1Text

Bar 
bar1Text

Baz 
baz1Text

Foo 2
foo2Text

Bar 
bar2Text

Baz 
baz2Text

# and so on up to Foo/Bar/Baz N

现在,我正在使用的正则表达式是:

([\S ]+)(\n*)([\s\S]*?)Bar([\s\S]*?)Baz([\s\S]*?)

现在 - 我想做的是取消与foo / bar / baz相关的文字。但是,使用正则表达式末尾的惰性限定符?时,表达式会停止并且会错过baz2text。相反,让它贪婪地匹配其他所有内容作为最后一组的一部分。

我希望在可能的情况下不使用数字限定符,并根据以下内容进行广泛匹配:

{title}
{stuff about title}

Bar
{stuff about Bar}

Baz
{stuff about Baz}

所以我可以遍历每个匹配并相应地提取组。请注意,我没有在提取具体输出方面做出这样的说法。我最感兴趣的是获得正则表达集团'所以他们代表:{title}{stuff about title}{stuff about bar}{stuff about Baz}

我和regex101一起玩,看看我是否能确定正确的咒语无济于事。

这是其中一个容易手动完成的问题。但后来我什么都学不到! :)我很想知道我是否应该使用一些更清洁的机制/策略。

非常感谢

1 个答案:

答案 0 :(得分:1)

如果你知道FooBaz之后的下一个群组,那么你需要的是一个 lookahead([\S ]+)(\n*)([\s\S]*?)Bar([\s\S]*?)Baz([\s\S]*?)(?=Foo)

前瞻是零宽度断言,因此它确保紧接着匹配,但不会改变当前位置。