解析纯文本树结构的最佳方法是:
node1:
node1
node2:
node1
node2:
node1
node2
node3:
node1:
node1
node2:
node1
node2
并将其转换为树结构(带有列表或词典)?
是否有任何python库可以帮助我解析?
答案 0 :(得分:4)
rson库将执行此操作,除非您可能必须将解析器子类化以允许在单个结构中混合数组和dict样式元素。
修改实际上,这可能有点困难,但rsonlite包将(按类别)与您的数据一起工作。
rsonlite是一个小型的单模块软件包,只有300行,同样的源代码适用于Python 2和Python 3。
以下示例显示了数据的3种不同输出。第一个输出是rsonlite.dumps()
给出的,第二个输出是略高级rsonlite.simpleparse()
给出的,第三个输出从simpleparse
获取结果并通过自定义{{ 1}}用于创建纯嵌套字典数据结构的函数,其中任何缺失值都设置为fixup()
,并且检查并去除所有冒号字符。
None
会给:
[(' node1:',[' node1',(' node2:',[' node1'])] ),(' node2:',[' node1', ' node2',(' node3:',[(' node1:',[' node1']),(&#39 ; node2:',[' node1', '节点2'])])])]
OrderedDict([' node1:',[' node1',OrderedDict([' node2:', ' node1')])]),(' node2:',[' node1',' node2',OrderedDict([(& #39;节点3:&#39 ;, OrderedDict([(' node1:',' node1'),(' node2:',[' node1', '节点2'])]))])])])
{' node1':{' node1':无,' node2':' node1'},' node2&# 39;:{' node1':无, ' node2':无,' node3':{' node1':' node1',' node2':{& #39; node1':无, ' node2':无}}}}
答案 1 :(得分:1)
您可以构造一个简单的解析器,从输入生成有效的python表达式,然后对其进行求值。我最初的想法是一个简单的递归解析器,但这比我预期的要困难,因为他们无法知道块在没有前面的峰值的情况下结束 - 这是基于缩进格式的常见问题。
这会生成嵌套的元组列表(block_name,[contents]):
i = 0
r = '['
for l in mystring.split('\n'):
if not l:
continue
cl = l.lstrip(' ')
ci = (len(l) - len(cl))//4
if ci > i: # line indented
r += '['
elif ci < i: # line unindented, can be multiple
r += '])'*(i-ci) + ','
if cl[-1] == ':': # new block
r += '{("{}":'.format(cl[:-1])
else: # new item
r += '"{}",'.format(cl)
i = ci
r += ']'+')]'*i
eval(r)
输出:
[('node1', ['node1', ('node2', ['node1'])]),
('node2',
['node1',
'node2',
('node3', [('node1', ['node1']), ('node2', ['node1', 'node2'])])])]