2012-04-03 92 views
10

我试图解析形式的字符串:不能得到pyparsing快译通()返回嵌套的词典

'foo(bar:baz;x:y)' 

我想的结果,在嵌套字典的形式,即返回对于上面的字符串,其结果应该是这样的:

{ 'foo' : { 'bar' : 'baz', 'x' : 'y' } } 

尽管快译通()和集团的众多组合()我无法得到它的工作。我(的版本之一)的语法如下:

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'} 

所以,问题是什么是错的第一种情况(和我对问题的理解),或者也许词典()不能与这样的情况下应付呢?我可以使用asList()并将其手动转换为字典,但我宁愿pyparsing这样做:)

任何帮助或指导将grely赞赏。

谢谢。

回答

6

两个问题:

  • 你缺少一个pp.Dict各地pp.delimitedList使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'}} 
+0

尼斯风风火火失踪'pp.Dict'。另外,尝试打印'res.dump()'以查看嵌套的键和值。 (由于'res'是一个ParseResults对象,它将支持嵌套的字典式访问,而无需使用asDict进行转换:'res ['foo'] ['x']'give'y';或者您可以使用虚线属性表示法只要键很好Python标识符:'res.foo.bar'给出'baz'。) – PaulMcG 2012-04-03 16:00:41

+0

嗨@Paul,很高兴收到作者自己的赞美:)我发现'res.dump()'没有太多的信息不仅仅是'str(res)',但是我可能不知道如何解释它?我应该说,从来没有使用过pyparsing。 – 2012-04-03 16:04:23

+0

非常感谢Niklas!我不知道在结果里面还有ParseResults实例,我认为它们既可以是列表也可以是字典。保罗 - 感谢您使用没有转换的字典,这可能实际上适用于我正在工作! :) – kgr 2012-04-03 16:04:33