我不知道为什么 pyparsing 会为 asDict() 和 asList() 产生不同的结果。请把我推向正确的方向。
import pyparsing as pp
WALRUS = pp.Keyword(':=').suppress()
number = pp.pyparsing_common.number
hex_number = pp.Literal('16#').suppress() + pp.Word(pp.hexnums+'_')
YesNo = pp.CaselessKeyword('YES').setParseAction(lambda t: True)\
| pp.CaselessKeyword('NO').setParseAction(lambda t: False)
dblQuoString = pp.dblQuotedString().addParseAction(pp.removeQuotes)
propertyName = pp.Word(pp.alphas)('key') # + pp.Keyword(':=').suppress()
# value = dblQuoString | YesNo | hex_number | number | pp.Word(pp.alphanums + '.') # the same result
value = pp.MatchFirst([dblQuoString,
YesNo,
hex_number,
number,
pp.Word(pp.alphanums + '.')]
)
value.setDebug()
key_value = propertyName + WALRUS + value('value')
if __name__ == "__main__":
test_string = r"""Description := "Anything" """
r = key_value.parseString(test_string)
print(r.asDict())
print(r.asList())
...和
{'key': 'Description', 'value': ['Anything']}
['Description', 'Anything']
为什么当结果为Dict时'Anything'会被包装到列表中?
我预计 {'key': '描述', 'value': '任何内容'}
好吧,这是 pyparsing 的某种魔力,其原因我并不完全清楚。
value = dblQuoString
给出输出 'value': 'Anything'
value = dblQuoString ^ YesNo ^ hex_number ^ number ^ pp.Word(pp.alphanums + '.')
输出列表'value': ['Anything']
我自己这样决定:
value.addParseAction(lambda t: t[0])