2015-07-13 2 views
2

J'ai quelques données qui peuvent être analysées en utilisant la fonction OneorMore de pyparsing. Quelque chose comme,acccumulate using pyparsing

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

bar et foo sont 2 parseurs.

Le problème avec cette fonction est que chaque fois que OneorMore jeu parseurs foo et bar dans le flux de données, les valeurs correspondantes associées aux touches "foo" et "bar" sont updated.But, comment puis-je accumuler toutes les valeurs appariées de foo et bar?

Je suis en train de mettre en œuvre quelque chose comme le many1 analyseur monadique dans Haskell, sauvegarder le résultat de l'analyse syntaxique foo et bar dans un type de données Algébrique, comme

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] 

Comment puis-je faire cela en python?

+0

Serait-il possible d'afficher "résultat réel Python" vs "résultat Python désiré" pour ceux qui ne sont pas familiers avec Haskell? – CoupleWavyLines

Répondre

2

Je ne suis pas sûr à 100% que je comprends ce que vous demandez, et je suis rouillé avec pyparsing, mais je pense que Group va vous aider.

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

Cela fonctionne très bien - Les groupes gardent plusieurs résultats avec le même nom de conflit. – PaulMcG

+0

C'est ce que je cherchais! – felipez