Python 非贪婪前瞻正则表达式

Python 非贪婪前瞻正则表达式,python,regex,pattern-matching,match,Python,Regex,Pattern Matching,Match,我有一个文件,我需要从中提取一些数据,用Python。其结构如下: .I 1 .T some multiline text .A some multiline text .B some multiline text .W some multiline text .I 2 .T some multiline text .A some multiline text .B some multiline text .W some multiline text 如您所见,存在一些重复模式。我需要一个接一

我有一个文件,我需要从中提取一些数据,用Python。其结构如下:

.I 1
.T
some multiline text
.A
some multiline text
.B
some multiline text
.W
some multiline text
.I 2
.T
some multiline text
.A
some multiline text
.B
some multiline text
.W
some multiline text
如您所见,存在一些重复模式。我需要一个接一个地提取它们。这是我的eegex:

\.I\s(\d*)\n       # .I section
\.T\n([\d\D]*?)    # .T section
\.A\n([\d\D]*?)    # .A section
\.B\n([\d\D]*?)    # .B section
\.W\n([\d\D]*)     # .W section
(?=\.I\s+\d+)     # look ahead section, which behaves greedy
一切都很好,但最后一部分(向前看)是贪婪的。我需要一个非贪婪的lookahead正则表达式,但我找不到它

我们可以使用
*?
+?
{m,n}?
应用非贪婪行为,但我找不到
(?=…)
的这种语法


当我用这个正则表达式搜索匹配项时,它只找到一个匹配项,而有两个匹配项。这是因为前瞻操作符的贪婪性质。我怎样才能有一个非贪婪的前瞻性?

我不明白为什么前瞻性的贪婪性很重要,我希望下面的方法能起作用:

\.I\s(\d*)\n
\.T\n([\d\D]*?)
\.A\n([\d\D]*?)
\.B\n([\d\D]*?)
\.W\n([\d\D]*?)
(?=\.I\s+\d+|$)

现在我想起来了,我认为维克托·斯特里比奥是对的。前瞻不能贪婪或懒惰:要么有匹配,要么没有匹配,匹配什么并不重要。

当我在regex101.com中粘贴你的正则表达式时,它告诉我最后一个问号有错误。您也看到了吗?另外,您不想
\.W\n([\d\d]*?)
?然后删除前瞻。他们不能贪婪或懒惰。他们限制比赛。如果您的前瞻只包含可选的子模式,那么它是没有用的。@Fartab。。。它应该匹配,您的.W部分与其他部分没有什么不同,它应该工作正常same@Fartab此外,我在regex101中测试了下面的reggae(见我的答案),似乎匹配一切都很好。我的错误是在.W部分后缺少问号,最后一场比赛还需要一美元。谢谢@julien虽然它和什么匹配很重要!你如何告诉它匹配第一场比赛而不是最后一场?