2016-03-21 2 views
0

У меня есть файл в формате всегда трех строк, за которым следует пустая строка. Какое регулярное выражение будет соответствовать таким блокам из трех строк?Соответствующие текстовые блоки, заключенные в новые строки

line1 
line2 
line3 

line4 
line5 
line6 
... 

Я знаю, что ^\s*$ может соответствовать строку, которая содержит только пустое пространство, так что-то вроде ^\s*$(.*)^\s*$ должно соответствовать что-то между двумя пустыми строчками, но не похоже на работу.

+3

Что регулярное выражение модели вы пробовали? Зачем вам нужно использовать регулярное выражение, если оно всегда является пустой строкой каждой четвертой строки? – mhawke

+0

Почему бы просто не использовать 'str.split ('\ n \ n')'? – niemmi

+0

@niemmi: 'str.split()' может быть нежизнеспособным, если файл большой – mhawke

ответ

2

Вы можете использовать itertools.islice(), чтобы прочитать файл 4 строки в то время, и выбросить последнюю строку, если она является новой строкой:

from itertools import islice 

with open('input') as f: 
    while True: 
     lines = [line.strip() for line in islice(f, 4) if line.strip()] 
     if not lines: 
      break 
     print(lines) # or otherwise process them 

Demo

С этим входом:

 
line1 
line2 
line3 

line4 
line5 
line6 

line7 
line8 

выход

 
['line1', 'line2', 'line3'] 
['line4', 'line5', 'line6'] 
['line7', 'line8'] 

Это также обрабатывает случай, когда файл заканчивается без полной группы из 3 строк.

2

Вы могли бы сделать использование groupby функции Python, чтобы читать строки, пока пустая строка не найдена следующим образом:

from itertools import groupby 

with open('input.txt') as f_input: 
    for k, g in groupby(f_input, lambda x: x != '\n'): 
     if k: 
      print [line.strip() for line in g] 

Это будет читаться каждые три строки в качестве блока. Если бы были дополнительные пустые строки, они также были бы пропущены или если в блоке было больше трех строк, они также были бы прочитаны как один блок.

Эта печать будет следующее:

['line1', 'line2', 'line3'] 
['line4', 'line5', 'line6'] 
+0

Мне это нравится. Это более гибко, чем решение 'islice()' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – mhawke

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