如何在pyparsing中指定令牌排序?

Ale*_*lex 4 python parsing pyparsing

假设我正在解析以下行:

The quick brown fox jumps over the lazy dog
Run Code Online (Sandbox Code Playgroud)

我想把它解析为:

Words('The quick brown fox') + Literal('jumps') + Words('over the lazy dog')
Run Code Online (Sandbox Code Playgroud)

我目前的pyparsing定义是:

some_words = OneOrMore(Word(alphas))
jumps      = Literal('jumps')
sentence   = some_words + jumps + some_words
Run Code Online (Sandbox Code Playgroud)

发生了什么事情some_words吞噬了' jumps',我得到一个解析错误.如何将跳跃作为文字标记进行pyparsing lex?

Pau*_*McG 5

你已经在思考解析器了,因为你明白它OneOrMore(Word(alphas))会继续前进,甚至读到"跳跃"这个词.现在转过来,编写解析器,按照你的想法做事.

对于每个"跳跃"的单词,你怎么知道它应该被添加到领先的单词集中?你知道每个单词,因为它不是"跳跃"这个词.Pyparsing不会自动执行此预测,但您可以使用NotAny(可以使用'〜'运算符缩写)自行执行此操作:

JUMPS = Literal("jumps")
some_words = OneOrMore(~JUMPS + Word(alphas))
Run Code Online (Sandbox Code Playgroud)

在匹配另一个单词之前,some_words首先验证该单词不是"跳跃".