Aquí es un enfoque más detallado del problema utilizando pyparsing. Tenga en cuenta las acciones de análisis que hacen la conversión automática de tipos de cadenas a ints o flotantes. Además, la clase QuotedString quita implícitamente las comillas del valor cotizado. Finalmente, la clase Dict toma cada grupo 'key = val' en la lista delimitada por comas, y asigna nombres de resultados usando los tokens de clave y valor.
from pyparsing import *
key = Word(alphas)
EQ = Suppress('=')
real = Regex(r'[+-]?\d+\.\d+').setParseAction(lambda t:float(t[0]))
integer = Regex(r'[+-]?\d+').setParseAction(lambda t:int(t[0]))
qs = QuotedString('"')
value = real | integer | qs
dictstring = Dict(delimitedList(Group(key + EQ + value)))
Ahora para analizar su cadena de texto original, almacenar los resultados en dd. Pyparsing devuelve un objeto de tipo ParseResults, pero esta clase tiene muchas características similares a dict (soporte para keys(), items(), in, etc.), o puede emitir un dict verdadero de Python llamando a asDict(). Calling dump() muestra todos los tokens en la lista analizada original, más todos los elementos nombrados. Los últimos dos ejemplos de muestran cómo acceder a los elementos con nombre dentro de ParseResults como si fueran atributos de un objeto de Python.
text = 'name="John Smith", age=34, height=173.2, location="US", avatar=":,=)"'
dd = dictstring.parseString(text)
print dd.keys()
print dd.items()
print dd.dump()
print dd.asDict()
print dd.name
print dd.avatar
Lienzo:
['age', 'location', 'name', 'avatar', 'height']
[('age', 34), ('location', 'US'), ('name', 'John Smith'), ('avatar', ':,=)'), ('height', 173.19999999999999)]
[['name', 'John Smith'], ['age', 34], ['height', 173.19999999999999], ['location', 'US'], ['avatar', ':,=)']]
- age: 34
- avatar: :,=)
- height: 173.2
- location: US
- name: John Smith
{'age': 34, 'height': 173.19999999999999, 'location': 'US', 'avatar': ':,=)', 'name': 'John Smith'}
John Smith
:,=)
Esto funciona: simplemente agregue rutinas para convertir los valores finales en cadenas/ints, etc., y quizás elimine las comillas dobles no deseadas incluidas en los valores. – twneale
Muy bien, gracias! Sabía que las expresiones regulares serían la respuesta, ¡pero nunca logré aprender a usarlas de manera eficiente! – astrofrog
Créanme amigo, valen la pena el esfuerzo. ¡Encuentre un buen probador de expresiones regulares interactivo (como redemo.py) y moje sus pies! – twneale