例: リテラル "alpha"、"beta"、"gamma" があります。pyparsing で次の入力を解析するにはどうすればよいですか。
alpha
alpha|beta
beta|alpha|gamma
指定された入力は、"|" で区切られた、指定されたセットから 1 つ以上の非反復リテラルを使用して作成できます。pyparsing の設定に関するアドバイスをいただければ幸いです。
「+」または「|」の代わりに、「&」演算子を各に使用します。すべてを取得する必要があるが、順序が予測できない場合は、次を使用します。
Literal('alpha') & 'beta' & 'gamma'
一部が欠落している可能性があるが、それぞれが最大 1 回しか使用されていない場合は、オプションを使用します。
Optional('alpha') & Optional('beta') & Optional('gamma')
おっと、「|」を忘れました 区切り記号。寛大なパーサーの 1 つは、delimitedList を使用することです。
delimitedList(oneOf("alpha beta gamma"), '|')
これにより、選択の一部またはすべてが許可されますが、重複を防ぐことはできません。解析アクションを使用するのが最も簡単かもしれません:
itemlist = delimitedList(oneOf("alpha beta gamma"), '|')
def ensureNoDuplicates(tokens):
if len(set(tokens)) != len(tokens):
raise ParseException("duplicate list entries found")
itemlist.setParseAction(ensureNoDuplicates)
これは私にとって最も単純なアプローチのように感じます。
編集:
最近のバージョンの pyparsing では、この種の解析アクションを簡単に記述できるようにするために、解析時の条件が導入されました。
itemlist = delimitedList(oneOf("alpha beta gamma"), '|')
itemlist.addCondition(lambda tokens: len(set(tokens)) == len(tokens),
"duplicate list entries found")