0

包含相关数据的字符串通过 Popen 函数和标准输出从子进程发送。

 run = subprocess.Popen('evo -x "' + folder+filename+'"', stdout = subprocess.PIPE, stderr = subprocess.PIPE, env={'LANG':'C++'})
 data, error = run.communicate()

打印相关信息的字符串如下所示:

printf "height= %.15f \ntilt = %.15f (%.15f)\ncen_volume= %.15f\nr_volume= %.15f\n", height, abs(sin(tilt*pi/180)*ring_OR), abs(tilt), c_vol, r_vol;

并输出到控制台print data(在标准输出中还有一些额外的东西):

Evolver 2.40, May 8, 2072; Windows OpenGL, 32-bit

Converting to all named quantities...Done.
Enter command: QUIET
height=    0.000211813357854 
tilt=0.0 (0.0)
cen_volume= 0.000000000600000
r_volume= 0.000000003000000
bad

我将它与:

dat = re.match("[\s]*height\s*=\s*([-]?[\.\d]*)[\s]*tilt\s*=\s*([-]?[\.\d]*)[\s]*\(([\s]*[-]?[\.\d]*)\)[\s]*cen_volume\s*=\s*([-]?[\.\d]*)[\s]*r_volume\s*=\s*([-]?[\.\d]*)[\s]*", data)

但是,这将返回“无”。这个完全相同的 .match 用于在从 txt 文件而不是 stdout 读取后匹配完全相同信息的程序中,并且在这种情况下可以完美运行。当通过通信检索字符串时,处理字符串的方式是否存在异常,或者添加了一些不寻常的额外不可见字符?请注意, .findall 非常适合匹配re.findall("[\s]*(bad)[\s]*", data),但即使尝试仅匹配一行与 .match 仍然失败。

4

2 回答 2

2

两个问题:

  1. 使用re.searchasre.match将要求字符串从第一个字符开始匹配
  2. 为您想要的多行搜索类型添加re.MULTILINE和标记re.DOTALL

尝试:

>>> re.search("[\s]*height\s*=\s*([-]?[\.\d]*)[\s]*tilt\s*=\s*([-]?[\.\d]*)[\s]*\(([\s]*[-]?[\.\d]*)\)[\s]*cen_volume\s*=\s*([-]?[\.\d]*)[\s]*r_volume\s*=\s*([-]?[\.\d]*)[\s]*", v,re.MULTILINE|re.DOTALL).groups()
('0.000211813357854', '0.0', '0.0', '0.000000000600000', '0.000000003000000')
于 2012-07-11T16:06:55.803 回答
1

在这种情况下使用 findall 可能更简单:

from pprint import pprint
pprint(dict(re.findall(r"(height|tilt|cen_volume|r_volume)\s*=\s*(.*\S)", data)))

输出

{'cen_volume': '0.000000000600000',
 'height': '0.000211813357854',
 'r_volume': '0.000000003000000',
 'tilt': '0.0 (0.0)'}
于 2012-07-11T16:32:54.323 回答