Python StringEnd()在匹配失败时引发异常-PyParsing

Python StringEnd()在匹配失败时引发异常-PyParsing,python,pyparsing,Python,Pyparsing,以下打印“通过”: pattern = Word(alphanums) + StringEnd() str=" bar " results = pattern.parseString(str) if 1 == len(results) && "bar" == results[0] : print("pass") else: print("fail") 但这会在类StringEnd的parseImpl中引发异常(当“bar”中“r”后面的字符不是字符串结尾时):

以下打印“通过”:

pattern = Word(alphanums) + StringEnd()
str=" bar "
results = pattern.parseString(str)
if 1 == len(results) && "bar" == results[0] :
    print("pass")
else:
    print("fail")
但这会在
类StringEnd
parseImpl
中引发异常(当“bar”中“r”后面的字符不是字符串结尾时):

我希望第2/3次parseString调用只返回一个空数组,因为它显然不能满足语法要求

有人能帮我理解为什么吗


(应该很明显,但要运行,您需要“从pyparsing导入*”;我也使用python3.2和pyparsing 1.5.6)

当您调用语法上的
parseString
时,您告诉它“使用此语法解析此字符串,从开头开始”。它必须匹配某些内容,否则将引发异常。当您使用
parseAll=true
时,这是双重正确的。您的意思是“根据此语法匹配整个字符串”。如果不匹配,则为错误
parseString
不是一种“可选”类型的匹配,如果您尝试匹配错误的语法,它将自动失败。如果某个东西“显然与语法不匹配”,那么这正是它应该引起错误的时候

您可能需要尝试
searchString
。这将只查找字符串中的所有匹配项,无论它们位于何处:

>>> pattern = pyp.Word(pyp.alphanums)
>>> pattern.searchString(" bar foo ")
([([u'bar'], {}), ([u'foo'], {})], {})

在失败的匹配上返回空列表是不明确的-语法是否匹配并仅返回空匹配,还是根本不匹配

>>> from pyparsing import *
>>> integer = Word(nums)
>>> expr = Suppress("data:") + ZeroOrMore(integer) + StringEnd()
分析一些数据:

>>> expr.parseString("data: 1 2 3").asList()
['1', '2', '3']
成功解析,这里没有任何数字:

>>> expr.parseString("data:").asList()
[]
异常告诉您此匹配失败:

>>> expr.parseString("data: 4 Z 6 7").asList()
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 12), (line:1, col:13)
expr.parseString(“数据:4 Z 6 7”).asList() 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“c:\python26\lib\site packages\pyparsing-1.5.6-py2.6.egg\pyparsing.py”,第1032行,parseString格式 加薪 pyparsing.ParseException:预期的文本结尾(在字符12处),(第1行,第13列)
到底抛出了什么异常?@catchmeifyoutry它抛出了一个
ParseException
,在barthanks中“r”后面的字符处,作为回复,我将接受这一点,再加上一点信息——附加到prev comment中-\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu失败的“无”是否足够在我的项目中,我试图匹配的部分可能会经常失败;我想知道它是否符合继续进行其他行为。(来自C++背景)我希望避免以我知道会引发异常的方式执行代码——换句话说,出于性能原因,将异常排除在快乐路径之外。在Python中,异常的性能通常不被视为主要问题,对于这些语法来说,引发ParseException是一种自然的语法计算堆栈的展开。这就是每个ParseRelation类的实现模式,以匹配已定义的模式或引发ParseException。这也是解析操作向其他正确匹配添加语义计算的一种方法。例如,您可以实现一个范围检查操作,该操作将采用一个匹配的整数,然后在该整数不在有效范围内时引发ParseException。
>>> expr.parseString("data:").asList()
[]
>>> expr.parseString("data: 4 Z 6 7").asList()
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 12), (line:1, col:13)