2016-06-07 3 views
1

Хорошо, хорошие люди stackOverflow, мой вопрос находится на широком предмете разбора. Информация, которую я хочу получить, находится на нескольких позициях в текстовом файле, отмеченном начальными и конечными заголовками (специальные строки) для каждого вида. Я хочу получить все, что находится между этими заголовками. Код, который я реализовал до сих пор, кажется каким-то ужасно неэффективным (хотя и не медленным), и, как вы можете видеть ниже, использует два заявления while.Скорее специальный синтаксический анализ файла txt

with open(sessionFile, 'r') as inp_ses: 
    curr_line = inp_ses.readline() 
    while 'ga_group_create' not in curr_line: 
     curr_line = inp_ses.readline() 
    set_name = curr_line.split("\"")[1] 
    recording = [] 
    curr_line = inp_ses.readline() 
    # now looking for the next instance 
    while 'ga_group_create' not in curr_line: 
     recording.append(curr_line) 
     curr_line = inp_ses.readline() 

Не обращайте внимание на то, что начальные и конечные заголовки и та же строка (просто называть их «начать» и «конец»). Приведенный выше код дает мне текст между заголовками только в первый раз, когда они появляются. Я могу изменить его, чтобы дать мне все остальное, отслеживая переменные, которые увеличиваются в каждом экземпляре, изменяя мои заявления и т. Д., Но все это похоже на попытку заново изобрести колесо и очень плохо.

Есть ли что-нибудь, что я могу использовать?

+0

Регулярное выражение в глобальном масштабе (захват) между вашими разделителями? –

+0

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

+0

Ваш код работает, но вы хотите его улучшить? Может быть лучше разместить его на codereview.stackexchange.com – AlG

ответ

1

Я согласен регулярное выражение, это хороший способ пойти сюда, но это более непосредственное применение к вашей проблеме:

import re 

options = re.DOTALL | re.MULTILINE 
contents = open('parsexample.txt').read()  
m = re.search('ga_group_create(.*)ga_group_create', contents, 
       options)  
lines_in_between = m.groups(0)[0].split() 

Если вы есть несколько таких групп, вы можете перебирать их:

for m in re.finditer('ga_group_create(.*?)ga_group_create', contents, options): 
    print(m.groups(0)[0].split()) 

Примечание Я использовал *? сделать неживое соответствие.

+0

Да. Если у вас несколько групп, вы можете не жадничать, используя '*?' Вместо '*'. Я добавил метод для обработки нескольких групп в моем ответе. – chthonicdaemon

2

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

Основы использования

import re 
m = re.search('start(.*?)end', 'startsecretend') 
m.group(1) 
'secret' 
  • . соответствует любому символу
  • * повторяет любое количество раз
  • ? делает не жадный т.е. он не будет регистрироваться 'end'
  • () указывает группу или захват

Больше на Python re manual

+0

Капитан Гавличек, похоже, он должен быть m.group (1), верно? –

+0

Да, исправлено –

+0

Сейчас я попытаюсь пройти полный удар. Спасибо за краткое введение в моря регулярного выражения. –

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