pyparsing 错误

6 投票
1 回答
5898 浏览
提问于 2025-04-17 12:33

我在使用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 个回答

7

| 是用来创建一个“优先匹配”的表达式,而不是“最长匹配”。

第一个选择是正则表达式,它会匹配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 是不一样的。

撰写回答