在 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,并且只会解析尾随的 ()
而不会进一步解析。
我正在尝试使用 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,并且只会解析尾随的 ()
而不会进一步解析。