2011-01-21 11 views
9

tengo cadena de la siguiente manera:Creando el diccionario desde el espacio separado cadena de clave = valor en Python

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

Quiero convertir a un diccionario de la siguiente manera:

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

¿Cómo hago esto en Python?

+0

lo que debería suceder si la cadena es '' key1 = "" foo "clave2 bar =" baz''? –

+0

Estoy analizando la salida de un archivo de registro y no espero salida en ningún otro formato. –

Respuesta

15

Prueba esto:

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

Si también quiere despojar a las comillas:

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

Gracias. Esto resolvió mi problema. –

+0

No puedo entender por qué la expresión regular es r '(\ S +) = (". *?" | \ S +)', a diferencia de r '(\ S +) = (\ ". *? \" | \ S +) '. ¿No necesitas escapar del personaje especial? ¿O simplemente sabes que "no tiene ningún significado especial en python regex? – AlanSE

18

La clase shlex hace que sea fácil de escribir analizadores léxicos de sintaxis simples se asemejan a la de el shell de Unix. Esto a menudo será útil para escribir minilanguajes , (por ejemplo, en ejecutar archivos de control para aplicaciones Python) o para analizar cadenas entre comillas.

import shlex 

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

print dict(token.split('=') for token in shlex.split(s)) 
Cuestiones relacionadas