我正在使用grep
从文件中抓取文本:
NELECT = 44.0000 total number of electrons,
,我需要将数字保存为变量。我尝试了一些在这里找到的方法,例如使用过滤器和findall
。由于某种原因,我只能将其分隔为零。
到目前为止,代码如下:
wd=os.getcwd()
electrons=str(os.system("grep 'NELECT' "+wd+"/OUTCAR"))
VBM=(re.findall('\d+', electrons))
print VBM
作为回报,我得到['0']。
答案 0 :(得分:1)
os.system的结果是命令的退出状态,而不是命令的输出-请参见https://docs.python.org/3/library/os.html#os.system
codecs.open
“ NELECT”行仅由grep打印到stdout,但未捕获到结果变量中
$ cat OUTCAR
NELECT = 44.0000 total number of electrons,
$ python
Python 2.7.12 (default, Dec 4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> result = os.system("grep 'NELECT' "+os.getcwd()+"/OUTCAR")
NELECT = 44.0000 total number of electrons,
>>> result
0
或者,不要调出grep,请自己阅读文件
>>> from subprocess import check_output
>>> result2 = check_output(["grep", "NELECT", os.getcwd()+"/OUTCAR"])
>>> result2
'NELECT = 44.0000 total number of electrons,\n'
>>> import re
>>> re.findall(r'\d+', result2)
['44', '0000']
或者,也许不要使用正则表达式:
>>> import os
>>> import re
>>> with open(os.getcwd() + "/OUTCAR") as f:
... for line in f:
... if "NELECT" in line:
... digits = re.findall(r'\d+', line)
... break
...
>>> digits
['44', '0000']
答案 1 :(得分:0)
您确定electrons
已指定输出吗?对我而言,此正则表达式返回包含两个元素的列表:['44', '000']
,这是预期的行为。因此,很可能grep调用有问题。
您的正则表达式将不会检索整个44.000
,因为\d+
仅捕获连续的数字字符串,而没有点号。要获取整数,请使用\b\d+\.\d+\b
之类的含义,即:任何单词(包含正则表达式中的\b
与任何字符匹配,都必须转义点(.
意味着单词的开头/结尾,点必须转义))数字,点和至少1个数字。如果点是可选的,则类似以下内容:\b(\d+(?:\.\d+)?)\b
((?:)
创建将不会被捕获的组,因此您的输出仍将是单个元素列表)。
请注意,re.findall
将返回字符串匹配列表。要从第一个匹配项中检索号码:float(VBM[0])
编辑。忘了补充:避免使用print语句,它与元组奇怪地工作,并且在Python 3中已完全删除。Python2支持在2020年结束,因此最好做好准备。您可以通过在文件开头添加from __future__ import print_function
来用Python 3打印功能替换print语句。