在python中研究具有可变数字的字符串

在python中研究具有可变数字的字符串,python,file-search,Python,File Search,我有一个文本文件,其中包含以下格式的几行: 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.

我有一个文本文件,其中包含以下格式的几行:

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

单词元素后面的数字从1变为60。我的第一个目标是读取这个文本文件,并停止每次出现ELEMENT=1到ELEMENT=60这个词

我的测试脚本读取元素的第一次出现。我现在想看一下元素的60次出现,所以我尝试在元素后面实现一个变量,在这个示例中,我将它初始化为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

那么我的问题是如何在搜索中实现变量

只需在块上迭代:

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))
这将查找以元素开头并以下一个块或文件结尾的行块。然后将找到的块解析为任意内容

印刷品:

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:
  if re.match(r"ELEMENT=",line):
    words = line.split()
    if int(words[1]) == elem:
      # Do whatever you're trying to do.

如果搜索的行始终以元素开头,则有一种简单的方法可以解决此问题:

lines = open("myfile.txt", "r").readlines()
for line in lines:
  if line.startswith("ELEMENT"):
    words = line.split()
    print "ELEMENT : " + words[1] + ", PLY : " + words[3]
使用此选项,您将在每次找到元素行时打印行内容。您可以使用相同的技巧轻松提取代码和GP行内容

一些简单的更改:

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

不要尝试比较==floats-结果很好

如果我正确理解您的问题,您可以在搜索中植入一个变量,如下所示:

if re.search( r"ELEMENT=      {}".format(elem), line ):

阅读此文本文件,并在每次出现单词ELEMENT=1到ELEMENT=60时停止。。。看看它是否会起作用,你可以猜到它不会起作用。那么,它会崩溃吗?我已经添加了返回的错误代码。事实上,我的目标是从一个大文本文件中只提取我文章中显示的60个数据块。我希望这更清楚。是的,我有一个很好的猜测-见下面我的答案:谢谢大家的回答。如果我能再问一件事:我该怎么做才能让我的脚本开始搜索我的文本文件,而不是从开头开始,而是从包含特定字符串的行开始?谢谢你的回答。当我试图运行您的代码时,我得到以下错误:File./stackover.py,第25行,在print'Group{}==:\n{}。formati,m.group1 ValueError:zero-length字段名格式中我做错了什么?您有Python 2.6吗?如果是这样,您需要执行“Group{0}==:\n{1}”。formati,m.group1注意花括号内的0和1。或者升级到2.7——它已经过时4年了……是的,我有python 2.6。但是我们在虚拟机上工作,我们有一个旧版本的Ubuntu,从我读到的,我不应该升级我的python版本。谢谢您的回答。您可以保留系统Python,并在本地或虚拟目录中安装新版本。