使用Python从特定格式的字符串中提取数据

使用Python从特定格式的字符串中提取数据,python,regex,parsing,format,Python,Regex,Parsing,Format,我是Python的新手,目前正在尝试使用它来解析一些自定义输出格式化字符串。事实上,该格式包含命名的浮点列表和浮点元组列表。我写了一个函数,但它看起来太过分了。如何才能以更适合Python的方式完成 import re def extract_line(line): line = line.lstrip('0123456789@ ') measurement_list = list(filter(None, re.split(r'\s*;\s*', line))) me

我是Python的新手,目前正在尝试使用它来解析一些自定义输出格式化字符串。事实上,该格式包含命名的浮点列表和浮点元组列表。我写了一个函数,但它看起来太过分了。如何才能以更适合Python的方式完成

import re

def extract_line(line):
    line = line.lstrip('0123456789@ ')
    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))
这:


将为您提供数字列表,这就是您要查找的吗?

您可以使用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)

请随意将其放入函数中,并检查键是否不存在。

不,它不存在。我需要这样的东西:{'points':[(2.96296,0.822213),(3.7037,0.902167)],'L':[5.20086],'P':[3.14815,3.51852]}
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)