#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)