限制特定pyparsing表达式中的新行

2024-10-06 19:28:34 发布

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

类似问题:Using PyParsing to parse language with signficant newlines (like Python)


我喜欢pyparsing的特性,它通常忽略空白,但是我的语法中有一些表达式,它们必须写在同一行上

问题是:如何限制特定表达式的换行?

我在文档中看到了setWhitespaceChars方法,它应该正好做到这一点,但它似乎不起作用(参见下面的示例)

例子

我需要解析以下表达式:

{
    ref: 4121!
}

这里大括号可以用新行格式化,但是ref部分必须是一行

我定义语法:

>>> import pyparsing as pp
>>> ref = pp.CaselessLiteral('ref:') + pp.Word(pp.nums) + '!'
>>> braces = '{' + ref + '}'

现在我尝试更改ref的空格:

>>> ref.setWhitespaceChars({' ', '\t'}) 
{{'ref:' W:(0123...)} "!"}
>>> ref.whiteChars
{'\t', ' '}

但是,当我尝试解析test_字符串(格式错误)时,它会毫无错误地解析它:

>>> test_string = 'ref:\n123\n!'
>>> ref.parseString(test_string)
(['ref:', '123', '!'], {})

我做错了什么

UPD:

似乎我需要对每个元素应用setWhitespaceChars,这些元素必须保持在同一行:

>>> import pyparsing as pp
>>> ref = pp.CaselessLiteral('ref:') + pp.Word(pp.nums).setWhitespaceChars(' \t\r') + pp.Literal('!').setWhitespaceChars(' \t\r')
>>> s = 'ref:\n123\n!'
>>> ref.parseString(s)
Traceback (most recent call last):
...
pyparsing.ParseException: Expected W:(0123...), found '\n'  (at char 4), (line:1, col:5)

这增加了太多的混乱,我可能最好在开始时调用setDefaultWhitespaceChars,然后在每个表达式周围添加换行符元素,我几乎认为我不需要进行pyparsing。还有其他解决办法吗


Tags: testimportref元素string表达式as错误