2012-07-18 140 views
1

下打印“通行证”:StringEnd()引发异常,当匹配失败 - PyParsing

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

但这罚球和中class StringEndparseImpl(例外的字符以下的“酒吧”“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 rd parseString调用只返回一个空数组,因为它显然不满足语法。

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

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

+0

究竟抛出了什么异常? – catchmeifyoutry 2012-07-18 17:29:03

+0

@catchmeifyoutry它会抛出一个'ParseException',在'0123'后面的字符'r'中 – mike 2012-07-18 18:05:05

回答

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

感谢您的回复,我会接受这一点的信息 - – mike 2012-07-21 01:32:33

+0

-append to prev comment- ___ 我解释这个就像您做出设计决定,以异常信号发生匹配失败一样。 ___ - “没有”失败已足够? ___ - 在我的项目中,我试图匹配的位可能会经常失败;我想知道它是否符合其他行为。 (来自C++背景)我想避免以我知道会引发异常的方式来执行代码 - 换句话说,为了性能的原因,将例外排除在开心路径之外。这在Python中是不是真的? – mike 2012-07-21 01:42:15

+0

在Python中通常不会将异常的性能看作是一个主要问题,对于这些语法来说,引发ParseException是语法评估堆栈的一种自然解体。因此,这是每个ParserElement类的实现模式,以匹配定义的模式或引发ParseException。这也是解析动作的一种方式,可以将一些语义评估添加到其他正确的匹配中。例如,您可以实现一个范围检查操作,该操作将采用匹配的整数,如果整数不在有效范围内,则会引发ParseException。 – PaulMcG 2012-07-21 20:03:26

2

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

你可能想尝试searchString代替。这将只是查找字符串中的所有比赛,无论他们在哪里:

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