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



以下打印"pass":

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

但这在class StringEndparseImpl中引发异常(当"bar"中"r"后面的字符不是字符串结尾时):

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

和这个一样:

pattern = Word(alphanums)
str = " bar foo"
results = pattern.parseString(str,parseAll=True)

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

有人能帮我理解为什么吗?

(应该是显而易见的,但要运行,您需要"from pyparcing import*";我也在使用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:python26libsite-packagespyparsing-1.5.6-py2.6.eggpyparsing.py", line 1032, in parseString
    raise exc
pyparsing.ParseException: Expected end of text (at char 12), (line:1, col:13)

最新更新