Pyparsing中的令牌化规则优先级
下面是我写的一个简单解析器:
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)