我怎样才能在Pyparsing中压扁词典

时间:2018-05-12 13:10:08

标签: pyparsing

Pyparsing允许命名lexer组件(或使用commit()用于相同的目的),解析后可以用作属性或dict条目。

这允许大多数已解析组件的平面视图......除非您需要以特定方式替换匹配的标记。

在我的情况下,我想要转换和复制它们。所以我创建了一个这样的函数:

setResultsName

这样可行,但会导致不需要的地图深度(嵌套替换会变得更糟)。我更倾向于能够在顶层创建两个条目结果,'comments'和'urls'并将原始令牌留给虚空。

可以这样做吗?请记住,转换不是原始输入的一部分,只是原始令牌,因此需要进行解析后修改,或者必须对语法进行一些奇怪的操作。

如果有一种方法可以添加def process_comments(_1,_2,token): urls = [] comments = [] #...transform here... return {"list":comments, "urls":urls} comments = ZeroOrMore(Suppress(Keyword("comment")) + quotes.copy()).setParseAction(process_comments) comments.setResultsName("comments") 令牌,我可以使用setParseAction自定义以获取最后一个匹配的令牌(非空)但我没有权利?

1 个答案:

答案 0 :(得分:1)

事实证明,为了展平这个我只需添加我的'setParserAction'直到注释语法的父级。它拥有自己对孩子进行解析后的所有信息,可以自行更换,从而“扁平化”或复制或改造孩子。