Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Général Python
Général Python Forum d'entraide sur les fondamentaux du langage Python, syntaxe, POO, bibliothèque standard, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/12/2012, 18h27   #1
magicvinni
Candidat au titre de Membre du Club
 
Vincent MAILLE
Inscription : avril 2010
Messages : 54
Détails du profil
Informations personnelles :
Nom : Vincent MAILLE

Informations forums :
Inscription : avril 2010
Messages : 54
Points : 10
Points : 10
Par défaut Arbre de calcul

Bonjour, je voudrais créer une fonction qui parse une expression mathématique (un problème classique pour lequel je n'ai pas trouvé de solution en python). Le but serait quelque chose du genre :

analyse('2*x+(3+x)') renverrai une liste : ['+','2*x','3+x']

J'arrive à parser l'expression en faisant :
Code :
1
2
3
4
5
6
 
import ast
st = ast.parse("2*x+(3+x)").body[0]
print st.value
print st.value.left
print st.value.right
Le problème est que je n'ai pas trouvé l'instruction pour recréer le membre de gauche et de droite. Avez-vous une solution ?

Merci d'avance,
Vincent

P.S : Je ne veux pas utiliser sympy car il effectue des simplifications au moment de la conversion.
magicvinni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 22h20   #2
tyrtamos
Expert Confirmé
 
Avatar de tyrtamos
 
Inscription : décembre 2007
Messages : 1 777
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 777
Points : 3 049
Points : 3 049
Bonjour,

Peut-être voir du côté de pyparsing: http://pyparsing.wikispaces.com/

Je ne le connais pas, mais il y a un exemple ici: http://pyparsing.wikispaces.com/file/view/fourFn.py

Avec lui, on peut obtenir par exemple:

'(2+3)/5^2' => ['2', '3', '+', '5', '2', '^', '/']

C'est de la polonaise inverse, mais on peut peut-être obtenir l'arbre que tu cherches en modifiant sa configuration?


[Edit] Sinon, avec ast:

Code :
1
2
3
4
5
6
7
8
9
10
y = ast.parse('2*x+(3+x)', "", "eval")
 
print ast.dump(y)
#Expression(body=BinOp(left=BinOp(left=Num(n=2), op=Mult(), right=Name(id='x', ctx=Load())), op=Add(), right=BinOp(left=Num(n=3), op=Add(), right=Name(id='x', ctx=Load()))))
print "=>", y.body.left, isinstance(y.body.left, ast.BinOp)
#=> <_ast.BinOp object at 0x021A83D0> True
print "=>", y.body.op, isinstance(y.body.op, ast.Add)
#=> <_ast.Add object at 0x021A3350> True
print "=>", y.body.right, isinstance(y.body.left, ast.BinOp)
#=> <_ast.BinOp object at 0x021A8430> True
__________________
Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
Mes recettes python: http://www.jpvweb.com
tyrtamos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/12/2012, 15h54   #3
magicvinni
Candidat au titre de Membre du Club
 
Vincent MAILLE
Inscription : avril 2010
Messages : 54
Détails du profil
Informations personnelles :
Nom : Vincent MAILLE

Informations forums :
Inscription : avril 2010
Messages : 54
Points : 10
Points : 10
Bonjour,

J'ai finalement recréé l'expression à la main via une petite fonction récursive, je pensais qu'elle existait déjà.

Merci pour la réponse,
Vincent
magicvinni est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h43.


 
 
 
 
Partenaires

Hébergement Web