2

以下のpyparsingで書かれた簡単なパーサーがあります。

import pyparsing as pp

Token = pp.Word(pp.alphas)("Token")
Modifier = pp.Word(pp.nums)("Modifier")

Random = pp.Group(pp.Keyword("?") + pp.OneOrMore(Modifier))("Random")
Phrase = pp.Group(Token + pp.OneOrMore(Modifier))("Phrase")

Collection = pp.Group(pp.delimitedList(Phrase ^ Random, ","))("Collection")

tree = Collection.parseString("hello 12 2, ? 1 2, word 4, ? 3 4, testing 5")

次に、これを試してみました。

>>> for name, item in tree[0].items():
        print name, item
Phrase ['testing', '5']
Random ['?', '3', '4']

...しかし、何らかの理由で、ツリーの最後Phraseのアイテムとアイテムのみが返されました。Randomどうすればそれらすべてを入手できますか?

(注:私もこれを試してみました:

>>> for item in tree[0]:
        print item
['hello', '12', '2']
['?', '1', '2']
['word', '4']
['?', '3', '4']
['testing', '5']

...しかし、ご覧のとおり、必要なトークン名は返されません。私もやってみitem.nameましたが、それらは常に空の文字列を返しました。)

pyparsingツリーを反復処理して、割り当てられた名前とともにすべてのアイテムを順番に取得するにはどうすればよいですか?

4

1 に答える 1

3

ParseResultsは、次の呼び出しによって定義名を取得できますgetName()

>>> for f in tree[0]: print f.getName(), f.asList()
... 
Phrase ['hello', '12', '2']
Random ['?', '1', '2']
Phrase ['word', '4']
Random ['?', '3', '4']
Phrase ['testing', '5']

setResultsName引数の使用と設定listAllMatchesをTrueに戻すこともできます。バージョン1.5.6では、expr("name")名前が「*」で終わる場合、それが。と同等になるようにショートカットが拡張されましたexpr.setResultsName("name", listAllMatches=True)。このフラグを設定すると、出力がどのように変化するかを次に示します。

>>> Random = pp.Group(pp.Keyword("?") + pp.OneOrMore(Modifier))("Random*")
>>> Phrase = pp.Group(Token + pp.OneOrMore(Modifier))("Phrase*")
>>> Collection = pp.Group(pp.delimitedList(Phrase ^ Random, ","))("Collection")
>>> tree = Collection.parseString("hello 12 2, ? 1 2, word 4, ? 3 4, testing 5")
>>> print tree.dump()
[[['hello', '12', '2'], ['?', '1', '2'], ['word', '4'], ['?', '3', '4'], ['testing', '5']]]
- Collection: [['hello', '12', '2'], ['?', '1', '2'], ['word', '4'], ['?', '3', '4'], ['testing', '5']]
  - Phrase: [['hello', '12', '2'], ['word', '4'], ['testing', '5']]
  - Random: [['?', '1', '2'], ['?', '3', '4']]
于 2012-07-26T18:46:35.223 に答える