Как захватить строки после совпадающей строки в python

Я любитель, использующий Python и выключается в течение некоторого времени. Извините, если это глупый вопрос, но мне было интересно, знает ли кто-нибудь простой способ захватить кучу строк, если формат во входном файле такой:

" Заголовок 1

строка 1

строка 2

строка 3

Заголовок 2

строка 1

строка 2

строка 3 "

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

единственный способ, которым я знаю, чтобы прочитать файл ,это" для строки в файле:", но я не знаю, как захватить строки после строки, на которой я сейчас. Надеюсь, это имеет смысл, и спасибо за помощь!

*Спасибо за все ответы! Я попытался реализовать некоторые из решений, но моя проблема в том, что не все заголовки имеют одинаковое имя, и я не знаю, как это обойти. Мне нужно другое регулярное выражение для каждого... есть предложения?*

4 ответов


Функции Генератора

def group_by_heading( some_source ):
    buffer= []
    for line in some_source:
        if line.startswith( "Heading" ):
            if buffer: yield buffer
            buffer= [ line ]
        else:
            buffer.append( line )
    yield buffer

with open( "some_file", "r" ) as source:
    for heading_and_lines in group_by_heading( source ):
        heading= heading_and_lines[0]
        lines= heading_and_lines[1:]
        # process away.

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

data = {}
for line in file:
    line = line.strip()
    if not line: continue

    if line.startswith('Heading '):
        if line not in data: data[line] = []
        heading = line
        continue

    data[heading].append(line)

вот http://codepad.org фрагмент, который показывает, как это работает:http://codepad.org/KA8zGS9E

редактировать: если вы не заботитесь о фактических значениях заголовка и просто хотите список в конце, вы можете использовать это:

data = []
for line in file:
    line = line.strip()
    if not line: continue

    if line.startswith('Heading '):
        continue

    data.append(line)

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


кроме генератора, я думаю, мы можем создать dict, где ключ "заголовок", а значение-один список для сохранения строк. Вот код

odd_map = {}
odd_list = []
with open(file, 'r') as myFile:
    lines = myFile.readlines()
    for line in lines:
        if "Heading" in line:
            odd_list = []
            odd_map[line.strip()] = odd_list
        else:    
            odd_list.append(line.strip())

for company, odds in odd_map.items():
    print(company)
    for odd in odds:
        print(odd)

Я действительно не знаю Python, но вот немного псевдокода.

int header_found=0;

[start where loop, где вы перебираете строки файла]

if(header_found==1) [grab line]; header_found=0;

if (line=~ / [регулярное выражение для заголовка]/) header_found=1;

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