2016-11-18 32 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