Python

2016-03-31 20 views
0

kullanarak belirli bir dize ile veri ayıklanıyor Python ile acemi yaşıyorum ve şu anda bazı özel çıkış biçimlendirilmiş dize ayrıştırmak için kullanmaya çalışıyorum. Aslında format, floatın isimlendirilmiş listelerini ve float tuples listelerini içerir. Bir fonksiyon yazdım ama aşırı görünüyor. Python için daha uygun bir şekilde nasıl yapılabilir?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)) 

cevap

0

Sen re.findall kullanarak bunu yapabilirsiniz:

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) 

bir işlevde koymak için çekinmeyin ve anahtarlar zaten var yoksa kontrol etmek.

0

Bu:

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] 

, size numaralar listenizi verecek sizin için bak ne bu?

+0

Hayır, öyle değil. Böyle bir şeye ihtiyacım var: {'puan': [(2.96296, 0.822213), (3.7037, 0.902167)], 'L': [5.20086], 'P': [3.14815, 3.51852]} – allaspaniel