2010-08-14 6 views
3

Par exemple, je disposer des données d'entrée suivantes:Comment dois-je lire les données d'entrée?

((12 3) 42)

Je veux traiter chaque valeur entière des données d'entrée. Ceci est un exemple de la présentation générale des données d'entrée.

Juste Pour plus d'informations:

Une telle présentation est correspondant à l'arbre binaire avec des feuilles marquées:

/\ 
    /\ 42 
12 3 

Répondre

3

Je recommande pyparsing pour cette tâche d'analyse syntaxique - here, par exemple, est un pyparsing- Parsers basés sur des expressions S ... probablement beaucoup plus riches et plus puissants que ce dont vous avez besoin, mais avec une compréhension très limitée de Python et de Pyparsing, vous pouvez les simplifier autant que vous le souhaitez (si c'est du effectuer votre tâche déjà, comme un sous-ensemble de l'ensemble plus large qu'il couvre ;-).

0

here est une bonne liste de ressources que vous pourriez utiliser. Je suggère PLY

0

quelque chose comme ce qui suit devrait fonctionner:

import re 
newinput = re.sub(r"(\d) ", r"\1, ", input) 
newinput = re.sub(r"\) ", r"), ", newinput) 
eval(newinput) 
+0

Avez-vous testé cette solution avant de poster? Est-ce que '(, 6, 9,)' est même une expression Python valide? – cji

+0

l'a réparé. J'aurais dû être) –

+1

Si j'avais besoin de quelque chose de vraiment léger, je pourrais le faire avec tout ce qui correspond à l'expression régulière '([\ d \ w()] *)' (ou au moins une version testée). sinon 'import eval_is_evil' sera évalué avec toutes les permissions du programme. Si vous pouvez obtenir du code malveillant à travers une version de travail de l'expression régulière que j'ai donnée, vous méritez de posséder mon système. – aaronasterling

1

J'ai écrit ce script. Il peut être utile

import tokenize,StringIO 
def parseNode(tokens): 
    l = [] 
    while True: 
     c = next(tokens) 
     if c[1] == '(': 
      l.append(parseNode(tokens)) 
     elif c[1] == ')': 
      return l 
     elif c[0] == tokenize.NUMBER: 
      l.append(int(c[1])) 
def parseTree(string): 
    tokens = tokenize.generate_tokens(StringIO.StringIO(string).readline) 
    while next(tokens)[1] != '(' : pass 
    return parseNode(tokens) 
print parseTree('((12 3) 42 15 (16 (11 2) 2))') 
Questions connexes