Python 解析空间缩进数据

Python 解析空间缩进数据,python,parsing,Python,Parsing,我有一些数据看起来像YAML,但不是。这是一个例子 An instance of A objectID=123 family=abc An instance of A objectID=234 family=bcd List of 4 X elements: An instance of X: objectID=222 name=ccc An instance of X: objectID=333 等等 我需要找到一种方

我有一些数据看起来像YAML,但不是。这是一个例子

An instance of A
  objectID=123
  family=abc

An instance of A
  objectID=234
  family=bcd
  List of 4 X elements:
    An instance of X:
      objectID=222
      name=ccc
    An instance of X:
      objectID=333
等等

我需要找到一种方法使它看起来更像这样:

[
  {'name': 'An instance of A',
   'data': [
     {'objectID': 123,
      'family': 'abc'
     }
   ]
 },
 ...
我试图创建一些递归函数来解析它,但结果却是一团糟

我并不要求提供一个完整的工作示例,但在python中实现这一点的最佳方法是什么?
自动调用功能?使用另一个库(我还没有找到)?使用另一种语言来帮助我并将整个内容嵌入python?

使用堆栈,当您发现缩进的级别或多或少时,从中推送和弹出项目;堆栈上的每个级别都保存缩进深度和条目:

stack = [(0, {})]  # indentation level, top-level entry
entry = stack[-1][1]

for line in input:
    line = line.strip()
    if not line: continue

    indentation = len(input) - len(input.lstrip())
    if indentation > stack[-1][0]:  # indented further? New entry
        entry = stack[-1][1]['data'] = {}
        stack.append((indentation, entry)) # push
    else:
        while indentation < stack[-1][0]:  # indentation dropped
            del stack[-1]       # pop
            entry = stack[-1][1]

    # process line and add to entry

result = stack[0][1]
stack=[(0,{})]#缩进级别,顶级条目
条目=堆栈[-1][1]
对于行输入:
line=line.strip()
如果不是第行:继续
缩进=len(输入)-len(输入.lstrip())
如果缩进>堆栈[-1][0]:#是否进一步缩进?新条目
entry=stack[-1][1][data']={}
stack.append((缩进,条目))#push
其他:
当缩进<堆栈[-1][0]:#缩进下降
del stack[-1]#pop
条目=堆栈[-1][1]
#处理行和添加到条目
结果=堆栈[0][1]

您可以尝试使用类似的库。当您到达以复合结尾的复合结尾时,这将失败:它只会从堆栈中弹出一个内容,而不是两个(或更多)内容。你需要像python那样做,保持一个缩进堆栈并弹出堆栈,直到达到以前使用的缩进(或者报告错误,或者如果以前没有使用新的缩进,尝试猜测它们的意思。)@rici:True,那么你需要在堆栈中包含缩进计数。将我的答案更新为这样做,然后弹出,直到缩进级别再次匹配。