标记规则优先顺序

时间:2014-03-09 22:30:06

标签: python tokenize pyparsing rule operator-precedence

以下是我的玩具解析器:

from pyparsing import Word,OneOrMore,alphanums,nums

number=Word(nums)
word=OneOrMore(Word(alphanums))
greeting = word+(number)

tests = "Hello3 World 1234"
print tests, "->", greeting.parseString(tests)

我期望得到的结果是

['Hello3','World','1234']

但我收到错误:

ParseException: Expected W:(0123...) (at char 17), (line:1, col:18)

首先,“1234”字符串不应与“数字”规则匹配,因此“字”规则会忽略该字符串吗?

我怀疑是深夜,我在文档中遗漏了一些完全基本的内容,但是我已经两次查看了“开始使用pyparsing”O'Reilly pdf,但找不到解决方案。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

这与您的“1234”与word规则相匹配,因为您说它可能是字母或数字。 word规则会继续捕获包含“1234”的字词,因此错误是number规则永远不会被命中。

如果你对word的规则更接近python的标识符定义(不能以数字开头),这将修复你的解析器:

from pyparsing import Word, OneOrMore, alphas, alphanums, nums

number=Word(nums)
word=OneOrMore(Word(initChars=alphas, bodyChars=alphanums))
greeting = word+(number)

tests = "Hello3 World 1234"
print tests, "->", greeting.parseString(tests)