2016-11-18 35 views
0

virtualmin domain-list --multiline返回一个结构化字符串,我想将其转换为字典的字典列表。将结构化字符串转换为字典

的字符串看起来是这样的(有时有遗漏值):

do.ma.in.1 
    key1a: value1a 
    key1b: value1b 
    key1c: 
    ... 
do.ma.in.2 
    key2a: value2a 
    key2b: value2b 
    ... 
... 

(键:值对由字符串中4个空格缩进)
我想转换成这种形式:

[do.ma.in.1: {key1a: value1a, key1b: value1b, key1c: None ...}, 
do.ma.in.2: {key2a: value2a, key2b: value2b, ...}, ... 

到目前为止,我没有与re.split("\s*(?=^\S)", str)这让我

[do.ma.in.1\n key1a: value1a\n key1b: value1b\n key1c:\n ..., 
do.ma.in.2\n key2a: value2a\n key2b: value2b\n ..., ... 
分割字符串

其中列表项只是字符串。 (所以没有真正的字典项目)

我从哪里去?

+0

是那些实际的键名格式或者他们只是例如键名? – depperm

+0

您的希望结果不是有效的Python表达式。你似乎对你是否想要一个列表或是一个字典的清单感到困惑。 –

+0

@depperm示例键名 – sebastian

回答

1

如果是我,我不会使用re。我会通过线逐步通过数据线,分配的值到适当的dict,因为我去:

from pprint import pprint 

data = ''' 
do.ma.in.1 
    key1a: value1a 
    key1b: value1b 
    key1c: 
do.ma.in.2 
    key2a: value2a 
    key2b: value2b 
''' 

key = None 
result = {} 
for line in data.splitlines(): 
    if not line.strip(): 
     continue 
    line = line.split(':', 1) 
    if len(line) == 1: 
     key = line[0].strip() 
     result[key] = {} 
    elif len(line) == 2: 
     result[key][line[0].strip()] = line[1].strip() 

pprint(result) 

结果:

{'do.ma.in.1': {'key1a': 'value1a', 'key1b': 'value1b', 'key1c': ''}, 
'do.ma.in.2': {'key2a': 'value2a', 'key2b': 'value2b'}} 
+0

太好了!我之前曾想到这件事,但我认为那不会是优雅的方式。谢谢一堆! – sebastian