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 个回答
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 是不一样的。