Как получить строки ПОСЛЕ совпавшей линии в Python - PullRequest
6 голосов
/ 04 января 2011

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

"Заголовок 1

Строка 1

Строка 2

Строка 3

Заголовок 2

Строка 1

Строка 2

Строка 3"

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

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

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

Ответы [ 4 ]

7 голосов
/ 04 января 2011

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

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.
4 голосов
/ 04 января 2011

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

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)

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

1 голос
/ 14 декабря 2015

Кроме генератора, я думаю, что мы можем создать 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)
0 голосов
/ 04 января 2011

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

int header_found = 0;

[начало цикла, где вы просматриваете строки файла]

if (header_found == 1) [захватить строку];header_found = 0;

if (line = ~ / [regexp для header] /) header_found = 1;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...