Pyparsing等同于quotedString Regex类型而没有引号?

时间:2018-01-11 15:36:20

标签: python parsing pyparsing

我正在尝试使用pyparsing实现(可选)嵌套函数语法。使用像here这样的简单语法,我立即启动并运行。

我的语法定义如下:

fnc = pp.Forward()
arg = pp.quotedString | pp.Word(pp.alphanums) | fnc #  + ' []:=&!*#$/+'
fnc << pp.Group(pp.Word('!$#&') + pp.Word(pp.alphanums) + pp.Literal('(') + pp.Optional(pp.delimitedList(arg)) + pp.Literal(')'))

因此,根据我在测试中收集到的内容,quotedString可以完全匹配任何类型的文本而没有任何问题,并且空格也可以正确处理。上面的fnc解析器几乎可以处理任何事情。例如"&foo(arg1, arg2)"(指向pp.Word(pp.alphanums))或"&foo('$Test,*Option1', &foo(arg2))"(第一个arg指向quotedString。此处额外符号"$,*"由quotedString处理我相信虽然我没有在某处明确定义它们。第二个arg指向fnc)。

当我写一些不在引号中的东西时,我的问题就出现了。例如,考虑一个带有关键字参数的函数:&foo(1,2.5,3.635, mode='multiply', decimals=3)。这已经引发了expecting ")" (at char 8)的异常,因为上面的arg中没有定义点。 (如果我把每个参数都放在引号中,这个例子就可以了!)

所以,我开始通过添加我想要解析的所有特殊字符来使arg越来越明确:

arg = pp.quotedString | pp.Word(pp.alphanums + ' \'[].:=&!*#$/+') | fnc 

现在的问题是,当我这样做时,函数递归会中断。示例"&foo('$arg1', &foo(arg2))"抛出异常expecting ")" (at char 18)(紧靠内部foo之后)。在上面的符号中包括括号将最终到达字符串的末尾,但它总是在最后一个位置处断开,期待&#34;)&#34;试。

我试图通过使用pp.printables来解决这个问题,并排除这样的括号:

arg = pp.quotedString | pp.Word(pp.printables, excludeChars="()") | fnc

但这会产生类似的结果。 因此我的问题。是否有任何(正则表达式或类似的东西),如quotedString开箱即用,但对于不带引号的字符串?我提前感谢您提出任何指示/解决方案。

0 个答案:

没有答案