2015-07-13 3 views
2

У меня есть некоторые данные, которые можно проанализировать с помощью функции OneorMore от pyparsing. Нечто подобное,acccumulate using pyparsing

fun = OneorMore(foo.setResultsName("foo") + bar.setResultsname("bar")) 

где bar и foo 2 парсеры.

Проблема с этой функцией является то, что каждый раз, что OneorMore матча Foo и бар парсеры в потоке данных, соответствующие значения, связанные с ключами "foo" и "bar" являются updated.But, как можно аккумулировать все совпавшие значения foo и bar?

Я пытаюсь реализовать что-то вроде many1 монадической парсер в Haskell, сохраняя результат разбора foo и bar в типе Алгебраические данных, как

data FooBar a = FooBar a a 

many1 :: ParsecT s u m a -> ParsecT s u m [a] 

many1 parserFooBar :: ParsecT s u m [FooBar a] 

Как я могу сделать это в Python?

+0

Можете ли вы показать «фактический результат Python» по сравнению с «желаемым результатом Python» для тех, кто не знаком с Haskell? – CoupleWavyLines

ответ

2

Я не уверен на 100%, я понимаю, что вы просите, и ржавый с пирарированием, но я думаю, Group поможет вам.

from pyparsing import * 

text = 'abc123xyz456def789' 
foo = Word(alphas) 
bar = Word(nums) 
fun = OneOrMore(Group(foo.setResultsName("foo") + bar.setResultsName("bar"))) 

results = fun.parseString(text) 

#Print all foo 
print [r.foo for r in results] 
#Print all bar 
print [r.bar for r in results] 
+0

Это работает очень хорошо - группы будут держать несколько результатов с тем же именем от столкновения. – PaulMcG

+0

Это был я искал! – felipez