gpt4 book ai didi

python - 无法让 pyparsing Dict() 返回嵌套字典

转载 作者:太空狗 更新时间:2023-10-29 18:07:19 24 4
gpt4 key购买 nike

我正在尝试解析以下形式的字符串:

'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 来做:)

如有任何帮助或指示,我们将不胜感激。

谢谢。

最佳答案

两个问题:

  • 您缺少 pp.delimitedList 周围的 pp.Dict 以使内部结果的 asDict 正常工作
  • 您只在最外层的 ParsingResult 实例上调用 asDict,让内部的 ParsingResult “未解释”

我尝试了以下方法:

from pyparsing import *
field_name = field_val = Word(alphanums)
colon = Suppress(Literal(':'))

expr = Dict(Group(
field_name +
nestedExpr(content =
Dict(delimitedList(
Group(field_name + colon + field_value),
delim = ';'
))
)
))

然后像这样使用它:

>>> res = expr.parseString('foo(bar:baz;x:y)')
>>> type(res['foo'])
<class 'pyparsing.ParseResults'>
>>> { k:v.asDict() for k,v in res.asDict().items() }
{'foo': {'x': 'y', 'bar': 'baz'}}

关于python - 无法让 pyparsing Dict() 返回嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9995627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com