При использовании setResultsName со значением listAllMatches true некоторые совпадающие элементы являются вложенными - PullRequest
0 голосов
/ 11 мая 2011

Основываясь на этой грамматике:

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']

1 Ответ

1 голос
/ 11 мая 2011

Прошло много времени с тех пор, как я посмотрел на эту проблему - проблема в том, что And всегда возвращает свои токены в виде списков, даже если они содержат только одно значение.

Вот группа, которая может прояснить это для вас, я включу это в следующий выпуск 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']
...