如何在pyparsing中指定令牌顺序?
假设我正在解析以下这一行:
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”。