我正在尝试解析表单的字符串:
'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:)
任何帮助或指示都会受到高度赞赏。
谢谢。
答案 0 :(得分:7)
两个问题:
pp.Dict
pp.delimitedList
左右,以使内部结果asDict
正常工作asDict
个实例上调用ParsingResult
,而内部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'}}