这里是使用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的对象,但该类具有许多类似于字典的功能(支持keys()、items()、in等),或者可以通过调用asDict()来发出真正的Python字典。 调用dump()显示原始解析列表中的所有标记,以及所有命名项。 最后两个示例展示了如何访问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
:,=)
avatar="p=0"
或更糟糕的是avatar="age=123"
。 如果这些问题让您担心,您将需要一个基于解析器的解决方案。顺便说一句,我不知道您是否对输入格式具有任何控制权,但 JSON 格式非常接近上述输入格式,并且几乎每种语言都有模块来解析它。http://json.org/ - Nick Craig-Wood