2011-01-21 15 views
9

Ho stringa come segue:Creazione dizionario dallo spazio separato stringa chiave = valore in Python

s = 'key1=1234 key2="string with space" key3="SrtingWithoutSpace"' 

voglio convertire in un dizionario come segue:

 
key | value 
-----|-------- 
key1 | 1234 
key2 | string with space 
key3 | SrtingWithoutSpace 

Come faccio a fare questo in Python?

+0

cosa dovrebbe succedere se la stringa è ' 'chiave1 = "" foo "bar key2 =" baz''? –

+0

Sto analizzando l'output di un file di registro e non mi aspetto output in nessun altro formato. –

risposta

15

Prova questo:

>>> import re 
>>> dict(re.findall(r'(\S+)=(".*?"|\S+)', s)) 
{'key3': '"SrtingWithoutSpace"', 'key2': '"string with space"', 'key1': '1234'} 

Se si vuole anche mettere a nudo le citazioni:

>>> {k:v.strip('"') for k,v in re.findall(r'(\S+)=(".*?"|\S+)', s)} 
+0

Grazie. Questo ha risolto il mio problema. –

+0

Non riesco a capire perché la regex sia r '(\ S +) = (". *?" | \ S +) ", al contrario di r' (\ S +) = (\". *? \ "| \ S +)'. Non hai bisogno di sfuggire al personaggio speciale? O sai solo che "non ha un significato speciale nella regex di Python? – AlanSE

18

La classe shlex rende facile scrivere analizzatori lessicali per semplice sintassi simile a quella di la shell Unix. Questo sarà spesso utile per scrivere miniforni , (ad esempio, per eseguire i file di controllo per le applicazioni Python) o per analizzare stringhe tra virgolette.

import shlex 

s = 'key1=1234 key2="string with space" key3="SrtingWithoutSpace"' 

print dict(token.split('=') for token in shlex.split(s)) 
Problemi correlati