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

4 投票
1 回答
785 浏览
提问于 2025-04-16 23:32

假设我正在解析以下这一行:

The quick brown fox jumps over the lazy dog

我想把它解析成:

Words('The quick brown fox') + Literal('jumps') + Words('over the lazy dog')

我现在的pyparsing定义是:

some_words = OneOrMore(Word(alphas))
jumps      = Literal('jumps')
sentence   = some_words + jumps + some_words

现在的问题是,some_words把'jumps'给吞掉了,所以我遇到了解析错误。我该怎么做才能让pyparsing把jumps当作一个字面量来处理呢?

1 个回答

5

你已经开始像解析器那样思考了,因为你明白 OneOrMore(Word(alphas)) 会一直继续,直到读取到“jumps”这个词。现在反过来,写一个解析器,让它按照你的思路来工作。

在“jumps”之前的每一个单词,你怎么知道它应该被加入到前面的单词集合中呢?你知道每个单词都不是“jumps”。Pyparsing 并不会自动进行这种前瞻检查,但你可以用 NotAny 来自己实现这个功能(可以用 '~' 符号来简写):

JUMPS = Literal("jumps")
some_words = OneOrMore(~JUMPS + Word(alphas))

现在,在匹配另一个单词之前,some_words 首先会确认这个单词不是“jumps”。

撰写回答