Pyparsing是否等效于没有引号的quotedString Regex类型?

2024-05-29 02:52:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试用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之后)。在上面的符号中包含圆括号将最终到达字符串的末尾,但它总是在最后一个位置中断,再次期望“)”。你知道吗

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

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

但这会产生类似的结果。 这就是我的问题。有没有什么东西(regex类型或其他类型)像quotedString这样的东西是开箱即用的,但对于不带引号的字符串呢?我提前感谢您的建议/解决方案。你知道吗


Tags: 函数类型定义foo语法arg引号pp

热门问题