0

関連データを含む文字列は、Popen 関数と stdout を介してサブプロセスから送信されます。

 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譲ります(stdoutにもあるいくつかの追加のものがあります):

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 は、stdout ではなく txt ファイルから読み込まれた後にまったく同じ情報に一致するプログラムで使用され、その場合は完全に機能します。文字列が通信を介して取得されたときに、文字列の処理方法に異常があるか、または異常な余分な非表示文字が追加されていますか? .findall は matching に対して完全に正常に機能しre.findall("[\s]*(bad)[\s]*", data)ますが、.match を使用して 1 行だけを一致させようとしても失敗することに注意してください。

4

2 に答える 2

2

2 つの問題:

  1. 最初の文字から一致する文字列が必要になるようにre.search使用するre.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 に答える