2016-11-18 2 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, ...}, ... 

은 지금까지 나는 나에게

[do.ma.in.1\n key1a: value1a\n key1b: value1b\n key1c:\n ..., 
do.ma.in.2\n key2a: value2a\n key2b: value2b\n ..., ... 
012,351,641있어 re.split("\s*(?=^\S)", str)로 문자열을 분할 않았다

목록 항목은 문자열입니다. (실제 사전 항목이 없으므로)

어디에서 나 가야합니까?

+0

그 실제 키 이름 형식입니다 또는 단지 예를 들어 키 이름입니다 ? – depperm

+0

당신이 원하는 결과가 유효한 파이썬 표현이 아닙니다. 당신은 당신이 dicts의 명부 또는 dicts의 dict의 목록을 원하는지에 관해 혼란스러워하는 것처럼 보인다. –

+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

관련 문제