以下打印'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)
答案 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)