2014-01-11 2 views
2

У меня есть большая многострочная строка с несколькими записями, соответствующими аналогичному формату. Я хотел бы разбить его на список строк для каждой записи.Разделить текст на разделы с помощью python regex

Я попытался следующие:

myre = re.compile('Record\sTime.*-{5}', re.DOTALL) 
return re.findall(myre, text) 

В этом случае данные начинаются с 'Record Time', и заканчивается '-----'. Вместо того, чтобы действовать так, как хотелось бы, приведенный выше код возвращает один элемент, начиная с начала первой записи, и заканчивается в конце последнего.

Возможно, я нашел способ сделать эту работу с помощью регулярного выражения, чтобы найти конец сегмента, а затем повторить с фрагментом исходного текста, начинающегося там, но это кажется беспорядочным.

ответ

5

Вам необходимо включить .* в неохотой матча, добавив знак вопроса:

.*? 

В противном случае он соответствует, насколько это возможно, с середины первой записи до середины последней записи.

См Greedy vs. Reluctant vs. Possessive Quantifiers

1

Что-то вроде этого:

txt='''\ 
Record Time 
1 
2 
3 
----- 

Record Time 
4 
5 
----- 
Record Time 
6 
7 
8 
''' 

import re 
pat=re.compile(r'^Record Time$(.*?)(?:^-{5}|\Z)', re.S | re.M) 
for i, block in enumerate((m.group(1) for m in pat.finditer(txt))): 
    print 'block:', i 
    print block.strip() 

распечаток:

block: 0 
1 
2 
3 
block: 1 
4 
5 
block: 2 
6 
7 
8 
1

Вы можете использовать это, чтобы избежать неохотой квантор, это уловка, чтобы эмулировать атомную группу: (?=(...))\1 , Это не совсем предмет, но может быть полезным:

myre = re.compile('Record\sTime(?:(?=([^-]+|-(?!-{4})))\1)+-{5}') 
Смежные вопросы