Pyparsing允许命名的词法分析器组件(或出于相同目的使用setResultsName
(,这些组件在解析后可以用作属性或字典条目。
这允许大多数解析组件的漂亮平面视图...除非需要以特定方式替换匹配的令牌。
就我而言,我想转换和复制它们。所以我创建了一个这样的函数:
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")
这有效,但会导致不必要的地图深度(并且随着嵌套替换而变得更糟(。我更希望能够在结果的顶层创建两个条目,"评论"和"url",并将原始令牌留给空白。
这能做到吗?请记住,转换不是原始输入的一部分,只是原始标记,因此这需要解析后的修改,或者必须在语法上做一些奇怪的事情。
如果有一种方法可以添加一个Empty
令牌,我可以使用 setParseAction 自定义该令牌以获取最后一个匹配的令牌(不为空(,那将是很酷的,但没有对吗?
事实证明,为了扁平化这一点,我只需添加以将我的"setParserAction"添加到注释语法的父级。它在自己解析子项后拥有所有信息,并且可以替换自身,从而"扁平化"或复制或转换子项。