在Python中搜索带有变量数字的字符串

0 投票
5 回答
541 浏览
提问于 2025-04-18 12:21

我有一个文本文件,里面有好几行,格式如下:

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 = 1ELEMENT = 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  

撰写回答