Исследуйте строку с переменным числом в Python
У меня есть текстовый файл, который содержит несколько строк в следующем формате:
ELEMENT= 1 PLY= 1
-----------------------
Code 1425
GP= 1 4.324E-03 -1.350E-03 -2.974E-03 3.084E-04 0.000E+00 0.000E+00
GP= 2 1.435E-03 -3.529E-04 -1.082E-03 1.183E-04 0.000E+00 0.000E+00
GP= 3 7.742E-03 -3.542E-03 -4.200E-03 4.714E-04 0.000E+00 0.000E+00
GP= 4 4.842E-03 -2.378E-03 -2.463E-03 3.040E-04 0.000E+00 0.000E+00
Число после слова ELEMENT
идет от 1 до 60. Моя первая цель - прочитать этот текстовый файл и остановиться на каждом появлении слова ELEMENT = 1
в ELEMENT = 60
Мой тестовый скрипт читает первое вхождение ELEMENT
, Я хотел бы сейчас пройти через 60 случаев ELEMENT
поэтому я попытался реализовать переменную, следующую ELEMENT
В этом примере я инициализировал его 2, чтобы посмотреть, будет ли он работать, и, как вы можете догадаться, это не так (см. пример кода ниже).
elem= 2
lines = open("myfile.txt", "r" ).readlines()
for line in lines:
if re.search( r"ELEMENT= %i" (line, elem) ):
words = line.split()
energy = float( words[1] )
print "%f" % energy
break
Я получаю следующий код ошибки:
File "recup.py", line 42, in <module>
if re.search( r"ELEMENT= %i" (line, elem) ):
TypeError: 'str' object is not callable
Тогда у меня вопрос: как мне внедрить переменную в мой поиск?
5 ответов
Просто переберите блоки:
import re
txt='''\
ELEMENT= 1 PLY= 1
-----------------------
Code 1425
GP= 1 4.324E-03 -1.350E-03 -2.974E-03 3.084E-04 0.000E+00 0.000E+00
GP= 2 1.435E-03 -3.529E-04 -1.082E-03 1.183E-04 0.000E+00 0.000E+00
GP= 3 7.742E-03 -3.542E-03 -4.200E-03 4.714E-04 0.000E+00 0.000E+00
GP= 4 4.842E-03 -2.378E-03 -2.463E-03 3.040E-04 0.000E+00 0.000E+00
ELEMENT= 2 PLY= 22
-----------------------
Code 1426
GP= 5 4.324E-03 -1.350E-03 -2.974E-03 3.084E-04 0.000E+00 0.000E+00
GP= 6 1.435E-03 -3.529E-04 -1.082E-03 1.183E-04 0.000E+00 0.000E+00
GP= 7 7.742E-03 -3.542E-03 -4.200E-03 4.714E-04 0.000E+00 0.000E+00
GP= 8 4.842E-03 -2.378E-03 -2.463E-03 3.040E-04 0.000E+00 0.000E+00
'''
for i, m in enumerate(re.finditer(r'^ELEMENT=\s+(\d+.*?)(?=^ELEMENT|\Z)', txt, re.M | re.S)):
print 'Group {}===:\n{}'.format(i, m.group(1))
Это найдет блоки строк, обозначенные ELEMENT и заканчивающиеся следующим блоком или концом файла. Затем разберите найденный блок во что угодно.
Печать:
Group 0===:
1 PLY= 1
-----------------------
Code 1425
GP= 1 4.324E-03 -1.350E-03 -2.974E-03 3.084E-04 0.000E+00 0.000E+00
GP= 2 1.435E-03 -3.529E-04 -1.082E-03 1.183E-04 0.000E+00 0.000E+00
GP= 3 7.742E-03 -3.542E-03 -4.200E-03 4.714E-04 0.000E+00 0.000E+00
GP= 4 4.842E-03 -2.378E-03 -2.463E-03 3.040E-04 0.000E+00 0.000E+00
Group 1===:
2 PLY= 22
-----------------------
Code 1426
GP= 5 4.324E-03 -1.350E-03 -2.974E-03 3.084E-04 0.000E+00 0.000E+00
GP= 6 1.435E-03 -3.529E-04 -1.082E-03 1.183E-04 0.000E+00 0.000E+00
GP= 7 7.742E-03 -3.542E-03 -4.200E-03 4.714E-04 0.000E+00 0.000E+00
GP= 8 4.842E-03 -2.378E-03 -2.463E-03 3.040E-04 0.000E+00 0.000E+00
Несколько простых изменений:
elem= 2
lines = open("myfile.txt", "r" ).readlines()
for line in lines:
words = line.split()
if words[0].startswith('ELEMENT'):
energy = int( words[1] )
if energy == elem:
break
print "%f" % energy
break
Не пытайтесь сравнивать == плавает - редко получается
Я не совсем уверен, что вы пытаетесь сделать, но если вы пытаетесь проверить, какая итерация ELEMENT
вы, это было бы лучше:
elem= 2
lines = open("myfile.txt", "r" ).readlines()
for line in lines:
if re.match(r"ELEMENT=",line):
words = line.split()
if int(words[1]) == elem:
# Do whatever you're trying to do.
Если искомая строка всегда начинается с "ELEMENT", есть простой способ обойти это:
lines = open("myfile.txt", "r").readlines()
for line in lines:
if line.startswith("ELEMENT"):
words = line.split()
print "ELEMENT : " + words[1] + ", PLY : " + words[3]
Используя это, вы будете печатать содержимое строки каждый раз, когда найдете строку "ЭЛЕМЕНТ". Вы можете легко извлечь содержимое строк "CODE" и "GP", используя один и тот же прием;).
Если я правильно понимаю ваш вопрос, вы можете "внедрить" переменную в поиск следующим образом:
if re.search( r"ELEMENT= {}".format(elem), line ):