1

以下は「パス」を出力します。

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

parseImplしかし、これはofで例外をスローしますclass StringEnd(「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 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 に答える