我正在尝试解析以下形式的字符串:
'foo(bar:baz;x:y)'
我希望结果以嵌套字典的形式返回,即对于上述字符串,结果应该如下所示:{ 'foo' : { 'bar' : 'baz', 'x' : 'y' } }
尽管我使用了多种Dict()和Group()的组合,但仍然无法使其工作。我的语法(其中一种版本)如下:
import pyparsing as pp
field_name = pp.Word( pp.alphanums )
field_value = pp.Word( pp.alphanums )
colon = pp.Suppress( pp.Literal( ':' ) )
expr = pp.Dict(
pp.Group(
field_name + \
pp.nestedExpr(
content = pp.delimitedList(
pp.Group( field_name + colon + field_value ),
delim = ';'
)
)
)
)
现在,结果如下所示:
In [62]: str = 'foo(bar:baz;x:y)'
In [63]: expr.parseString( str ).asList()
Out[63]: [['foo', [['bar', 'baz'], ['x', 'y']]]]
In [64]: expr.parseString( str ).asDict()
Out[64]: {'foo': ([(['bar', 'baz'], {}), (['x', 'y'], {})], {})}
In [65]: print( expr.parseString( str ).dump() )
Out[65]: [['foo', [['bar', 'baz'], ['x', 'y']]]]
- foo: [['bar', 'baz'], ['x', 'y']]
所以我认为asList()
版本看起来很不错,应该能得到我想要的字典。当然,鉴于(就我理解而言,请纠正我如果我错了)Dict()将通过使用列表的第一个元素作为键,并将其余所有元素作为该键的值来解析令牌列表,这在某种程度上可以实现非嵌套字典。例如,在这种情况下:
expr = pp.Dict(
pp.delimitedList(
pp.Group( field_name + colon + field_value ),
delim = ';'
)
)
In [76]: expr.parseString( 'foo:bar;baz:x' ).asDict()
Out[76]: {'baz': 'x', 'foo': 'bar'}
所以,问题是第一种情况有什么问题(以及我对问题的理解),或者可能是 Dict()无法处理这种情况?我可以使用 asList()
并将其手动转换为字典,但我宁愿让 pyparsing 来完成它 :)非常感谢任何帮助或指导。
谢谢。