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自定义以获取最后一个匹配的令牌(非空)但我没有权利?
答案 0 :(得分:1)
事实证明,为了展平这个我只需添加我的'setParserAction'直到注释语法的父级。它拥有自己对孩子进行解析后的所有信息,可以自行更换,从而“扁平化”或复制或改造孩子。