以下打印"pass":
pattern = Word(alphanums) + StringEnd()
str=" bar "
results = pattern.parseString(str)
if 1 == len(results) && "bar" == results[0] :
print("pass")
else:
print("fail")
但这在class StringEnd
的parseImpl
中引发异常(当"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)