2012-04-03 55 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