在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,并在本地或虚拟目录中安装新版本。