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

Capture literal brackets inside brackets in pyparsing

我正在尝试使用 PyParsing 解析一些函数参数,但无法获得正确的语法。即,给定:

str = "(key=val())"

我希望解析器 return ['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 暗示了问题但没有给出解决方案。

您对

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

过于自由。它不仅会匹配尾随 () 的,还会匹配任何嵌入的,并且不管匹配的打开和关闭,值如:

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

甚至只是:

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

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

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

然后组成值:

value = Combine(identifier + '()')

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