用关键字或纯文本匹配多行

时间:2019-09-06 17:41:15

标签: python pyparsing

import pyparsing as pp

pp.ParserElement.setDefaultWhitespaceChars(" \t")

# End of line. Clean it off.
NL = pp.LineEnd().suppress()

repeat_stmt = pp.Keyword("REPEAT") + pp.pyparsing_common.number()

end_stmt = pp.Keyword("END")

statement = (repeat_stmt | end_stmt)
text = pp.Group(~statement + pp.restOfLine)

structure = pp.ZeroOrMore(statement | text)
structure.ignore(NL)

DATA = """
line 1
line 2
a bit longer line 3
REPEAT 123
foo bar
END
"""

print(structure.parseString(DATA))

我正在尝试使用pyparsing构建相当简单的文本生成器。

鉴于上面的代码,我希望按原样复制非关键字行并解析关键字(当前全部为两个)。

以上代码只会以无限循环结束

我希望输出结果大致正确:

[
 ['line 2'], ['line 2'], ['a bit longer line 3'],
 [['REPEAT', 123]], ['foo bar'] [['END'],
]

我该如何实现?

1 个答案:

答案 0 :(得分:1)

如果启用NL解析调试,请使用setDebug,

ArrayList<String>

您将看到NL在输入字符串的末尾永远循环。您可以使用stopOn在ZeroOrMore时中断此循环:

NL = pp.LineEnd().suppress().setDebug()

通过此更改,您将获得:

structure = pp.ZeroOrMore(statement | text, stopOn=pp.StringEnd())