2016-02-25 2 views
0

У меня есть файл, в котором нужно извлечь некоторые данные из 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}?, но я не смог найти такой синтаксис для (?=...)

Когда я ищу на матч с этим регулярным выражением, он находит только один матч в то время как есть два , Это из-за жадного характера оператора взгляда. Как я могу получить не жадный взгляд?

+1

'(? = \. I \ s + \ d + | $)'? –

+0

, когда я вставляю ваше регулярное выражение в regex101.com, он сообщает мне, что есть ошибка с последним вопросительным знаком. Вы тоже это видите? –

+1

также, вы не хотите '\ .W \ n ([\ d \ D] *?)'? –

ответ

1

я не понимаю, почему жадность взгляда вперед важно, я хотел бы ожидать следующее работы:

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

Теперь, когда я думаю об этом, я думаю, что Wiktor Stribiżew прав. Взгляд вперед не может быть жадным или ленивым: либо есть матч, либо нет, и то, что он соответствует, не имеет значения.

+0

Моя ошибка отсутствовала в вопросительном знаке после секции .W, а также $, необходимой для последнего матча. Спасибо @Julien – Fartab

+0

@Fartab ... действительно :-) приветствую :-) –

Смежные вопросы