从带有 Python 和 Bash 的 grep 获得的字符串中删除非整数
Removing non integers from a grep obtained string w/ Python and Bash
我正在使用 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
在 return 中我得到 ['0']。
您确定 electrons
指定了输出吗?对我来说,这个正则表达式 returns 列表包含两个元素:['44', '000']
,这是预期的行为。所以很可能是 grep 调用出了问题。
您的正则表达式不会检索整个 44.000
,因为 \d+
仅捕获连续的数字字符串,没有点符号。要获得整数,请使用 \b\d+\.\d+\b
之类的东西,这意味着:任何包含在至少 1 位数字、点和至少 1 位数字。如果点是可选的,则类似这样:\b(\d+(?:\.\d+)?)\b
((?:)
创建不会被捕获的组,因此您的输出仍将是单个元素列表)。
请注意 re.findall
将 return 字符串匹配列表。从第一场比赛中检索号码:float(VBM[0])
编辑。忘记补充:避免使用 print 语句,它与元组一起工作很奇怪,并在 Python 3 中完全删除。 Python 2 支持将于 2020 年结束,因此最好做好准备。您可以通过在文件开头添加 from __future__ import print_function
来将打印语句替换为 Python 3 打印函数。
os.system 的结果是命令的退出状态,而不是命令的输出——参见 https://docs.python.org/3/library/os.html#os.system
$ 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
"NELECT" 行刚刚由 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']
或者,不要喊grep,自己看文件
>>> 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']
或者,也许不使用正则表达式:
>>> words = line.split()
>>> words[2]
'44.0000'
>>> int(float(words[2]))
44
我正在使用 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
在 return 中我得到 ['0']。
您确定 electrons
指定了输出吗?对我来说,这个正则表达式 returns 列表包含两个元素:['44', '000']
,这是预期的行为。所以很可能是 grep 调用出了问题。
您的正则表达式不会检索整个 44.000
,因为 \d+
仅捕获连续的数字字符串,没有点符号。要获得整数,请使用 \b\d+\.\d+\b
之类的东西,这意味着:任何包含在至少 1 位数字、点和至少 1 位数字。如果点是可选的,则类似这样:\b(\d+(?:\.\d+)?)\b
((?:)
创建不会被捕获的组,因此您的输出仍将是单个元素列表)。
请注意 re.findall
将 return 字符串匹配列表。从第一场比赛中检索号码:float(VBM[0])
编辑。忘记补充:避免使用 print 语句,它与元组一起工作很奇怪,并在 Python 3 中完全删除。 Python 2 支持将于 2020 年结束,因此最好做好准备。您可以通过在文件开头添加 from __future__ import print_function
来将打印语句替换为 Python 3 打印函数。
os.system 的结果是命令的退出状态,而不是命令的输出——参见 https://docs.python.org/3/library/os.html#os.system
$ 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
"NELECT" 行刚刚由 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']
或者,不要喊grep,自己看文件
>>> 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']
或者,也许不使用正则表达式:
>>> words = line.split()
>>> words[2]
'44.0000'
>>> int(float(words[2]))
44