非贪婪的前瞻性正则表达式

时间:2016-02-25 14:22:25

标签: 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

如您所见,有一些重复的重复模式。我需要逐一提取它们。这是我的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

一切都很好,但最后一节(前瞻)是贪婪的。我需要一个非贪婪的前瞻性正则表达式,但我找不到它。

我们可以使用*? +? {m,n}?来应用非贪婪行为,但我找不到(?=...)

的语法

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

1 个答案:

答案 0 :(得分:2)

我不明白为什么前瞻的贪婪很重要,我希望以下方面有效:

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

现在我想到了,我认为WiktorStribiżew是对的。前瞻不能贪婪或懒惰:无论是匹配还是没有,匹配的内容无关紧要。