Используйте оператор «&» для каждого вместо «+» или «|».Если вы должны иметь все, но в непредсказуемом порядке, используйте:
Literal('alpha') & 'beta' & 'gamma'
Если некоторые могут отсутствовать, но каждый используется не более одного раза, то используйте Optionals:
Optional('alpha') & Optional('beta') & Optional('gamma')
Упс, язабыл '|'разделители.Один снисходительный синтаксический анализатор будет использовать 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")