Pyparsing中的令牌化规则优先级

2 投票
1 回答
641 浏览
提问于 2025-04-17 21:34

下面是我写的一个简单解析器:

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”这个字符串不应该先被“数字”规则匹配,然后再被“单词”规则忽略吗?

我怀疑是因为现在太晚了,我在文档中漏掉了一些非常基础的内容,但我已经看过两遍O'Reilly的“pyparsing入门”pdf,还是找不到解决办法。感谢任何帮助。

1 个回答

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)

撰写回答