2016-11-18 4 views
0

virtualmin domain-list --multiline возвращает структурированную строку, которую я хотел бы преобразовать в список dicts dicts.Преобразование структурированной строки в словарь

Строка выглядит следующим образом (там иногда отсутствующие значения):

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

Примеры имен ключевых примеров ddepperm – 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

Смежные вопросы