2

例: リテラル "alpha"、"beta"、"gamma" があります。pyparsing で次の入力を解析するにはどうすればよいですか。

alpha
alpha|beta
beta|alpha|gamma

指定された入力は、"|" で区切られた、指定されたセットから 1 つ以上の非反復リテラルを使用して作成できます。pyparsing の設定に関するアドバイスをいただければ幸いです。

4

1 に答える 1

4

「+」または「|」の代わりに、「&」演算子を各に使用します。すべてを取得する必要があるが、順序が予測できない場合は、次を使用します。

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")
于 2010-08-03T19:33:09.293 に答える