python中的正则表达式-解析复杂数据组

python中的正则表达式-解析复杂数据组,python,python-3.x,regex,re,Python,Python 3.x,Regex,Re,如何使用正则表达式解析以下数据: Test data 1 Measurement 1 X : -0.100 Y : 2.300 Something 1 : 0.00 Stuff 1 : 0.00 Needed 1 X : -0.800 Y : 5.300 Te

如何使用正则表达式解析以下数据:

Test data 1
  Measurement 1     X            :      -0.100  Y :      2.300
  Something   1                  :       0.00
  Stuff       1                  :       0.00
  Needed      1     X            :      -0.800  Y :      5.300

Test data 2
  Measurement 1     X            :      -0.600  Y :      4.300
  Something   1                  :       0.30
  Stuff       1                  :      -0.20
  Extra       1                  :      -0.800
我想从测试数据1中提取测量1数据(X和Y值)和所需的1数据(X和Y值)

我还想从测试数据2中提取测量1数据(X和Y值)和额外的1数据

测量值在不同的表名下具有相同的名称

for line in data:
  if "Test data 1" in line
    match = re.match (r"   Measurement  1   X          :     ([\-\d\.]+)    Y :       ([\-\d\.]+)\s*$", line)
    if match:
       X_table1 = match.group(1)
       Y_table1 = match.group(2)
  if "Test data 2" in line
     match = re.match (r"   Measurement  1   X          :     ([\-\d\.]+)    Y :       ([\-\d\.]+)\s*$", line)
    if match:
       X_table2 = match.group(1)
       Y_table2 = match.group(2)

感谢您提供的帮助

您一次只处理一行数据,但X和Y值与段标题位于不同的行上。因此,您的代码需要记住它当前处理的段(即一个简单的解析器)。此外,还可以重用通用模式来提取X和Y值

data1=data2=False
xy\U模式=r'X\s+:\s+([\-\d\.]+)\s+Y\s+:\s+([\-\d\.]+)'
对于行输入数据:
#设定状态
如果行中有“测试数据1”:
数据1=真
持续
elif“测试数据2”行:
数据1=错误
数据2=真
持续
#提取数据
如果数据1和“测量”一致:
matches=re.findall(xy_模式,线条)
如果匹配:
X_table1,Y_table1=匹配[0]
elif数据2和行中的“测量”:
matches=re.findall(xy_模式,线条)
如果匹配:
X_表2,Y_表2=匹配[0]

同样,您可以检查
额外的
行。但是请注意,您的匹配项仍然是字符串,因此您可能希望将它们转换为浮点值,具体取决于您要对它们执行的操作。

您一次只处理一行数据,但X和Y值与段头位于不同的行上。因此,您的代码需要记住它当前处理的段(即一个简单的解析器)。此外,还可以重用通用模式来提取X和Y值

data1=data2=False
xy\U模式=r'X\s+:\s+([\-\d\.]+)\s+Y\s+:\s+([\-\d\.]+)'
对于行输入数据:
#设定状态
如果行中有“测试数据1”:
数据1=真
持续
elif“测试数据2”行:
数据1=错误
数据2=真
持续
#提取数据
如果数据1和“测量”一致:
matches=re.findall(xy_模式,线条)
如果匹配:
X_table1,Y_table1=匹配[0]
elif数据2和行中的“测量”:
matches=re.findall(xy_模式,线条)
如果匹配:
X_表2,Y_表2=匹配[0]

同样,您可以检查
额外的
行。但是请注意,您的匹配项仍然是字符串,因此您可能希望将它们转换为浮点数,具体取决于您要对它们执行的操作。

请尝试以下操作:

import re

with open('data.txt') as f:
    l = re.split(r'\n{2}', f.read())            # split the file into two blocks
    for i in l:
        if 'Needed' in i:
            m = re.search(r'Measurement.+X\s*:\s*(-?[\d.]+)\s+Y\s*:\s*(-?[\d.]+)', i)
            X_measure_table1, Y_measure_table1 = m.groups()
            m = re.search(r'Needed.+X\s*:\s*(-?[\d.]+)\s+Y\s*:\s*(-?[\d.]+)', i)
            X_needed_table1, Y_needed_table1 = m.groups()
        elif 'Extra' in i:
            m = re.search(r'Measurement.+X\s*:\s*(-?[\d.]+)\s+Y\s*:\s*(-?[\d.]+)', i)
            X_measure_table2, Y_measure_table2 = m.groups()
            m = re.search(r'Extra.+:\s*(-?[\d.]+)', i)
            X_extra_table2, = m.groups()

请您尝试以下方法:

import re

with open('data.txt') as f:
    l = re.split(r'\n{2}', f.read())            # split the file into two blocks
    for i in l:
        if 'Needed' in i:
            m = re.search(r'Measurement.+X\s*:\s*(-?[\d.]+)\s+Y\s*:\s*(-?[\d.]+)', i)
            X_measure_table1, Y_measure_table1 = m.groups()
            m = re.search(r'Needed.+X\s*:\s*(-?[\d.]+)\s+Y\s*:\s*(-?[\d.]+)', i)
            X_needed_table1, Y_needed_table1 = m.groups()
        elif 'Extra' in i:
            m = re.search(r'Measurement.+X\s*:\s*(-?[\d.]+)\s+Y\s*:\s*(-?[\d.]+)', i)
            X_measure_table2, Y_measure_table2 = m.groups()
            m = re.search(r'Extra.+:\s*(-?[\d.]+)', i)
            X_extra_table2, = m.groups()

请将您的数据包含在格式化的文本块中,而不是作为图像。您的数据是否包含两个以上的“测试数据”,或者总是正好包含两个?并且可以包含
所需的
额外的
,或者两者都包含,或者两者都不包含?(如果两者都是,总是以相同的顺序?)只有两个“测试数据”,但名称“测试数据”只是出于示例目的而通用。“测试数据1”始终包含“需要”,从不包含“额外”,而“测试数据2”始终包含“额外”,从不包含“需要”。请将您的数据包含在格式化文本块中,而不是作为图像。您的数据包含两个以上的“测试数据”,还是始终正好包含两个?并且可以包含
所需的
额外的
,或者两者都包含,或者两者都不包含?(如果两者都是,总是以相同的顺序?)只有两个“测试数据”,但名称“测试数据”只是出于示例目的而通用。“测试数据1”始终包含“需要”,从不包含“额外”,而“测试数据2”始终包含“额外”,从不包含“需要”。