Как захватить строки после совпадающей строки в 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;
идея состоит в том, чтобы иметь переменную, которая отслеживает, нашли ли вы заголовок, и если да, то захватить следующую строку.