2016-03-31 9 views
0

私はPythonの初心者ですが、現在はカスタム出力形式の文字列を解析するために使用しようとしています。実際のフォーマットには、floatの名前付きリストとfloatのタプルのリストが含まれています。私は関数を書いたが、それは過度に見える。どのようにしてより適切な方法でPythonを行うことができますか?Pythonを使用して特定の形式の文字列からデータを抽出する

import re 

def extract_line(line): 
    line = line.lstrip('@ ') 
    measurement_list = list(filter(None, re.split(r'\s*;\s*', line))) 
    measurement = {} 
    for elem in measurement_list: 
     elem_list = list(filter(None, re.split(r'\s*=\s*', elem))) 
     name = elem_list[0] 
     if name == 'points': 
      points = list(filter(None, re.split(r'\s*\(\s*|\s*\)\s*',elem_list[1].strip(' {}')))) 
      for point in points: 
       p = re.match(r'\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*', point).groups() 
       if 'points' not in measurement.keys(): 
        measurement['points'] = [] 
       measurement['points'].append(tuple(map(float,p))) 
     else: 
      values = list(filter(None, elem_list[1].strip(' {}').split(' '))) 
      for value in values: 
       if name not in measurement.keys(): 
        measurement[name] = [] 
       measurement[name].append(float(value)) 
    return measurement 

to_parse = '@10 points = { (2.96296 , 0.822213) (3.7037 , 0.902167) } ; L = { 5.20086 } ; P = { 3.14815 3.51852 } ;' 

print(extract_line(to_parse)) 

答えて

0

あなたはre.findallを使用してそれを行うことができます。

import re 
to_parse = '@10 points = { (2.96296 , 0.822213) (3.7037 , 0.902167) } ; L = { 5.20086 } ; P = { 3.14815 3.51852 } ;' 

m_list = re.findall(r'(\w+)\s*=\s*{([^}]*)}', to_parse) 
measurements = {} 
for k,v in m_list: 
    if k == 'points': 
     elts = re.findall(r'([0-9.]+)\s*,\s*([0-9.]+)', v) 
     measurements[k] = [tuple(map(float, elt)) for elt in elts] 
    else: 
     measurements[k] = [float(x) for x in v.split()] 

print(measurements) 

は機能にそれを置くこと自由に感じとキーがすでに存在しないかどうかをチェックします。

0

この:

import re 
a=re.findall(r' ([\d\.eE-]*) ',to_parse) 
map(float, a) 
>> [2.96296, 0.822213, 3.7037, 0.902167, 5.20086, 3.14815] 

はあなたの番号のリストを与える、あなたが探し何ということでしょうか?

+0

いいえ、そうではありません。 {'points':[(2.96296,0.822213)、(3.7037,0.902167)]、 'L':[5.20086]、 'P':[3.14815,3.51852]のようなものが必要です。 – allaspaniel

関連する問題