1

以下打印“通过”:

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

但这会抛出异常(当 'bar' 中parseImplclass StringEnd'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)

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

谁能帮我理解为什么?

(应该很明显,但要运行你需要'from pyparsing import *';我也在python3.2和pyparsing 1.5.6上)

4

2 回答 2

2

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

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

>>> pattern = pyp.Word(pyp.alphanums)
>>> pattern.searchString(" bar foo ")
([([u'bar'], {}), ([u'foo'], {})], {})
于 2012-07-18T17:36:49.087 回答
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)
于 2012-07-19T00:23:30.013 回答