这是使用 pyparsing 解决问题的更详细的方法。注意解析动作
它自动将类型从字符串转换为整数或浮点数。此外,该
QuotedString 类隐式地从引用的值中去除引号。最后,
Dict 类采用逗号分隔列表中的每个 'key = val' 组,并分配
结果名称使用键和值标记。
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)))
现在解析您的原始文本字符串,将结果存储在 dd 中。 Pyparsing 返回一个
ParseResults 类型的对象,但此类具有许多类似 dict 的功能(支持 keys(),
items()、in 等),或者可以通过调用 asDict() 发出真正的 Python dict。调用转储()
显示原始解析列表中的所有标记,以及所有命名项目。最后
两个示例显示了如何访问 ParseResults 中的命名项目,就好像它们是
一个 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
打印:
['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
:,=)