在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 个回答
0
如果我理解你的问题没错的话,你可以像这样把一个变量“放进”搜索里:
if re.search( r"ELEMENT= {}".format(elem), line ):
0
做几个简单的改动:
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
不要用 == 来比较浮点数,这样做通常不会得到好结果。
0
我不太确定你想要做什么,但如果你是想测试你当前处于第几次循环中的话,下面这种方法会更好:
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.
0
如果你要查找的那一行总是以"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]
用这个方法,每次找到以"ELEMENT"开头的行时,你都可以打印出那一行的内容。你也可以用同样的技巧轻松提取"CODE"和"GP"那几行的内容哦;)
0
只需要遍历这些代码块:
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