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

时间:2012-07-18 17:16:58

标签: python pyparsing

以下打印'pass':

pattern = Word(alphanums) + StringEnd()
str=" bar "
results = pattern.parseString(str)
if 1 == len(results) && "bar" == results[0] :
    print("pass")
else:
    print("fail")

但是这会在parseImpl的{​​{1}}中抛出异常(当'bar'中的'r'后面的字符串不是字符串结尾时):

class StringEnd

就像这样:

pattern = Word(alphanums) + StringEnd()
str=" bar foo "
results = pattern.parseString(str)  # <-- exception raised

我希望第二次/第三次parseString调用只返回一个空数组,因为它显然不符合语法。

任何人都可以帮我理解为什么吗?

(应该是显而易见的,但要运行你需要'从pyparsing import *';我也在python3.2和pyparsing 1.5.6)

2 个答案:

答案 0 :(得分:2)

当你在语法上调用parseString时,你告诉它“使用这个语法解析这个字符串,从头开始”。它必须匹配某些东西,否则会引发异常。使用parseAll=True时,这是真的。你说“将这整个字符串与这个语法相匹配”。如果它不匹配,那就是错误。 parseString不是一种“可选”类型的匹配,如果您尝试匹配错误的语法,它将无声地失败。如果“显然与语法不匹配”,那就是它应该引发错误的时候。

您可能想尝试使用searchString。这只会查找字符串中的所有匹配项,无论它们在哪里:

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

答案 1 :(得分:0)

在失败的匹配项上返回一个空列表是不明确的 - 语法匹配并返回空匹配,或者根本不匹配?

>>> 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)