从grep中删除非整数会获得带有Python和Bash的字符串

时间:2018-09-11 19:44:34

标签: python bash filter grep findall

我正在使用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']。

2 个答案:

答案 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语句。