Последовательный поиск в текстовом файле python - PullRequest
0 голосов
/ 25 января 2019

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

\* Source Pyomo model name=urbs *\

min 
obj:
+1 costs(Environmental)
+1 costs(Fixed)
+1 costs(Fuel)
+1 costs(Invest)
+1 costs(Variable)

s.t.

c_e_res_vertex(1_Mid_Biomass_Stock)_:
+1 e_co_stock(1_Mid_Biomass_Stock)
-1 e_pro_in(1_Mid_Biomass_plant_Biomass)
= 0

c_e_res_vertex(1_Mid_Coal_Stock)_:
+1 e_co_stock(1_Mid_Coal_Stock)
-1 e_pro_in(1_Mid_Coal_plant_Coal)
= 0

Так что, если файл lp похож на приведенный выше, мой скрипт должен распечатать или написать в текстовом файле следующие строки :

res_vertex(1_Mid_Biomass_Stock)
res_vertex(1_Mid_Coal_Stock)

Я обнаружил, что каждое ограничение начинается с 'c_e_' и заканчивается ')_', поэтому я написал следующую строку для получения первого ограничения res_vertex(1_Mid_Biomass_Stock):

with open('lp_file.lp', 'r') as lp:
    lp = lp.read().replace('\n', ' ')
    lp = str(lp[lp.find('c_e_')+4:
                lp.find(')_')+1])
    print(lp)

Над фрагментом кода фактически выводится первое ограничение, но мне нужно сделать это для последовательных ограничений (2-го, 3-го, 4-го и т. Д.) С циклом for, вероятно.

Я не могу заставить .find() искать какой-то индекс. Так как бы я решил это?

PS: имена ограничений не имеют одинаковую длину

1 Ответ

0 голосов
/ 25 января 2019

Вы можете использовать re.match с шаблоном, который извлекает то, что находится между 'c_e_' и ')_' (при условии, что output_file является файловым объектом для записи вывода):

import re
with open('lp_file.lp', 'r') as lp:
    for line in lp:
        match = re.match(r'c_e_(.*\))_', line)
        if match:
            print(match.group(1), file=output_file)
...