我试图用PyParsing解析一些函数参数,但是在获取正确的语法方面遇到了麻烦。即,给定:
str = "(key=val())"
我希望解析器返回['key', 'val()']
。
我一直在尝试使用以下代码:为清楚起见,故意省略.suppress()
次来电。
ob = Literal("(")
cb = Literal(")")
key = Word(alphas)
value = Word(alpha + "()")
parser = ob + key + "=" + value + cb
print parser.parseString(str)
但当然它也匹配最后的结束括号,所以我得到了一个ParseException。
这有一个优雅的解决方案吗?例如,我查看了nestedExpr
,但在这种情况下,它并不是严格意义上的嵌套,因为我希望将val()
视为文字。同样地,this question暗示了问题,但没有给出解决方案。
答案 0 :(得分:0)
您对
的定义value = Word(alpha + "()")
太自由了。它不仅匹配trailing(),而且匹配任何嵌入的,并且无论匹配的开启和关闭,值如:
SLDFJJ(sldkjf)
sdlkfj(sldkfj(lkskdjf)))(
甚至只是:
(((((())(()()()()
我建议您定义标识符的语法,通常类似于:
identifier = Word(alphas+'_', alphanums+'_')
然后用以下内容撰写值:
value = Combine(identifier + '()')
现在,value
表达式不会错误地接受任何嵌入式()
,并且只会解析尾随()
而不会进一步解析。