在pyparsing中捕获括号内的文字括号

时间:2016-02-15 22:12:46

标签: pyparsing

我试图用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暗示了问题,但没有给出解决方案。

1 个答案:

答案 0 :(得分:0)

您对

的定义
value = Word(alpha + "()")

太自由了。它不仅匹配trailing(),而且匹配任何嵌入的,并且无论匹配的开启和关闭,值如:

SLDFJJ(sldkjf)
sdlkfj(sldkfj(lkskdjf)))(

甚至只是:

(((((())(()()()()

我建议您定义标识符的语法,通常类似于:

identifier = Word(alphas+'_', alphanums+'_')

然后用以下内容撰写值:

value = Combine(identifier + '()')

现在,value表达式不会错误地接受任何嵌入式(),并且只会解析尾随()而不会进一步解析。