Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Membre à l'essai
    Profil pro Vincent MAILLE
    Inscrit en
    avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Nom : Vincent MAILLE

    Informations forums :
    Inscription : avril 2010
    Messages : 71
    Points : 22
    Points
    22

    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.

  2. #2
    Expert Confirmé
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    2 285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 2 285
    Points : 3 780
    Points
    3 780

    Par défaut

    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

  3. #3
    Membre à l'essai
    Profil pro Vincent MAILLE
    Inscrit en
    avril 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Nom : Vincent MAILLE

    Informations forums :
    Inscription : avril 2010
    Messages : 71
    Points : 22
    Points
    22

    Par défaut

    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

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •