pyparsing错误

时间:2012-02-08 06:54:08

标签: python parsing pyparsing

我在pyparsing中遇到了这个错误

from pyparsing import Word,alphas,nums,Or,Regex,StringEnd
ws = Regex('\s*')
dot = "."
w = Word(alphas) + (ws | dot) + StringEnd()
w.leaveWhitespace()
w.parseString('AMIT.')

返回以下错误:

ParseException: Expected end of text (at char 4), (line:1, col:5)

1 个答案:

答案 0 :(得分:6)

|创建“匹配优先”表达式,而不是“匹配最长”。

第一种选择是正则表达式,它将匹配0个或更多的空格字符。事实上, 匹配,因此不会解析点。

然后要解析的下一个元素是StringEnd,但是解析位置仍然位于'。' - 所以,失败!

通过向语法表达式添加setDebug()调用,可以获得更详细的输出:

>>> w = Word(alphas).setDebug() + (ws.setDebug() | dot.setDebug()) + StringEnd()
>>> w.parseString('AMIT.')
Match W:(abcd...) at loc 0(1,1)
Matched W:(abcd...) -> ['AMIT']
Match Re:('\\s*') at loc 4(1,5)
Matched Re:('\\s*') -> ['']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\python26\lib\site-packages\pyparsing-1.5.6-py2.6.egg\pyparsing.py", line 1032, in parseString
    raise exc
pyparsing.ParseException: Expected end of text (at char 4), (line:1, col:5)

为了让你的语法有效,你可以:

  • |运算符更改为^(匹配最长而非首先匹配)

  • 将正则表达式更改为\s+而不是\s*(以便匹配至少需要一个空格)

  • 将您的第二个字词更改为Optional(dot)

一般来说,对空白的显式测试与pyparsing哲学不一致 - pyparsing与re不同。