我在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)
答案 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不同。