Извлечение различных переменных из файла в Python

#python #regex

#python #регулярное выражение

Вопрос:

У меня есть файл, который выглядит как

 Output.txt 

A= 10 
B= -2.0 
C= 0.3

E. E.= 0.0077085100262409825
#Other stuff
E. E.= 0.007579616077337539
#Other stuff
E. E.= 0.007516578218920226
#Other stuff
E. E.= 0.007516578218913118
#Other stuff
E. E.= 0.007516578218910091
#Other stuff
E. E.= 0.007516578218925583
#Other stuff
E. E.= 0.00751656967834972
#Other stuff

a_{0} = 0.99638864684082906198
a_{1} = 0.99545718205037281301
a_{2} = 0.99810837983673184048
a_{3} = 0.99811186196548795646
a_{4} = 0.99811633864785687109
a_{5} = 0.99811633864785698211
a_{6} = 0.99811186196548884464
a_{0} a_{1} = 0.99544942851733930755
a_{1} a_{2} = 0.99451063074121059948
a_{2} a_{3} = 0.99716648871966484524
a_{3} a_{4} = 0.99716998943318368998
a_{4} a_{5} = 0.99717446741570991975
a_{5} a_{6} = 0.99716998943318446713
 

Я хотел бы извлечь значения «A», «B», «C», последнее значение «E. E.» и все значения «a_ {i}» и «a_ {i} a_{j}». Чтобы получить A, B и C, я использовал этот код, поскольку я точно знаю номера строк

 ftxt="Output.txt"
with open(ftxt) as fp:
    for i, line in enumerate(fp):
        if i == 0:
            print(line)
            match = re.search(r'd .?d*', line)
            if match:
                A=float(match.group())
        elif i == 1:
            print(line)
            match = re.search(r'd .?d*', line)
            if match:
                B=float(match.group())
        elif i == 2:
            print(line)
            match = re.search(r'd .?d*', line)
            if match:
                C=float(match.group())
        else:
            break
 

Как я могу извлечь остальные? Для последнего «E.E.» вывод должен быть «0.00751656967834972».
Для «a_ {i}» и «a_ {i} a_{j}» я хотел бы иметь массив с индексами i и j, а также значениями каждой переменной.

Ответ №1:

Как насчет использования словарей вместо создания переменных на лету?

 import re

p1 = re.compile(r'([A-Z]|(?:E. E.))s*=s*(-?d (?:.d )?)s*



)
p2 = re.compile(r'a_{(d )}s=s*(d .d )s*

)
p3 = re.compile(r'a_{(d )}s*a_{(d )}s=s*(d .d )s*

)

data = '''
A= 10
B= -2.0
C= 0.3

E. E.= 0.0077085100262409825
#Other stuff
E. E.= 0.007579616077337539
#Other stuff
E. E.= 0.007516578218920226
#Other stuff
E. E.= 0.007516578218913118
#Other stuff
E. E.= 0.007516578218910091
#Other stuff
E. E.= 0.007516578218925583
#Other stuff
E. E.= 0.00751656967834972
#Other stuff

a_{0} = 0.99638864684082906198
a_{1} = 0.99545718205037281301
a_{2} = 0.99810837983673184048
a_{3} = 0.99811186196548795646
a_{4} = 0.99811633864785687109
a_{5} = 0.99811633864785698211
a_{6} = 0.99811186196548884464
a_{0} a_{1} = 0.99544942851733930755
a_{1} a_{2} = 0.99451063074121059948
a_{2} a_{3} = 0.99716648871966484524
a_{3} a_{4} = 0.99716998943318368998
a_{4} a_{5} = 0.99717446741570991975
a_{5} a_{6} = 0.99716998943318446713
'''

d = {}
a = {}
aa = {}
for line in data.splitlines(True): # or for line in open(path)
m = p1.match(line)
if m:
k, v = m.groups()
d[k] = float(v)
continue

m = p2.match(line)
if m:
i, v = m.groups()
a[int(i)] = float(v)
continue

m = p3.match(line)
if m:
i, j, v = m.groups()
aa[(int(i), int(j))] = float(v)
continue

print(d)
print(a)
print(aa)