0

この文法に基づいて:

from pyparsing import *

g = quotedString.setParseAction( removeQuotes )
eg = Suppress('-') + quotedString.setParseAction( removeQuotes )
choice = Or( [ g.setResultsName("out",listAllMatches=True),     
              eg.setResultsName("in",listAllMatches=True) ] )
grammar = ZeroOrMore( choice ) + Suppress(restOfLine)

a = world.parseString( ' "ali"  -"baba"  "holy cow"   -"smoking beaute"  ' )
print a.dump()

非終端を満たすトークンegは常に追加のリストでラップされていることがわかりました。との唯一の違いgは、先頭に `Suppress('-')' があることです。

['ali', 'baba', 'holy cow', 'smoking beaute']
- in: [['baba'], ['smoking beaute']]
- out: ['ali', 'holy cow']

それらを同じように動作させるにはどうすればよいですか? 以下の結果を達成したい:

['ali', 'baba', 'holy cow', 'smoking beaute']
- in: ['baba', 'smoking beaute']
- out: ['ali', 'holy cow']
4

1 に答える 1

1

この問題を見てからしばらく経ちました。問題は、たとえ 1 つの値しか含まれていない場合でも、And が常にトークンをリストとして返すことです。

これを解決できる ungrouper を次に示します。次の pyparsing リリースに含めます。

ungroup = lambda expr : TokenConverter(expr).setParseAction(lambda t:t[0])
eg = ungroup(Suppress('-') + quotedString.setParseAction( removeQuotes ))

テスト コードを使用すると、次の結果が得られます。

['ali', 'baba', 'holy cow', 'smoking beaute']
- in: ['baba', 'smoking beaute']
- out: ['ali', 'holy cow']
于 2011-05-11T15:06:30.500 に答える