2011-09-01 3 views
1

Je crée un langage de programmation en Python et un composant principal qui me manque pour le langage de base est la capacité à analyser des équations mathématiques. J'ai la fonction d'analyser les maths mais je dois être capable de vérifier si l'entrée est une équation mathématique. Je cherche une regex pour correspondre à quelque chose comme 3 * x^(4 * y) + 1- (7 * y * z/x).Python Math Regex

+2

Bien qu'une expression régulière puisse * vérifier * une telle entrée, je suis sceptique à quel point vous pouvez compter sur elle pour * valider * l'équation. –

+4

Non, une expression régulière ne peut même pas * vérifier * si elle est syntaxiquement correcte. – aioobe

+0

@aioobe: Ce n'est pas parce que les modèles de Python ne sont pas à la hauteur de la tâche que personne ne l'est. [Beaucoup sont] (http://stackoverflow.com/questions/4840988/the-recognizing-power-of-modern-regexes/4843579#4843579). Tu sais ça. S'il vous plaît arrêtez de répéter. – tchrist

Répondre

2

Je suis à la recherche d'une expression régulière pour correspondre à quelque chose comme 3*x^(4*y)+1-(7*y*z/x).

Vous ne pouvez pas avoir une expression régulière qui correspond à des chaînes telles que "3 * x^(4 * y) ...". Les langages de parenthèse bien équilibrée sont simplement et non regular.

(En fait, quand on parle des expressions régulières spécifiques Python, ce qui précède est un mensonge. Mais si, je prétends que les expressions régulières seraient le mauvais outil pour cette tâche.)

Je la fonction pour analyser les maths ...

Si vous avez un analyseur, je vous suggère d'essayer simplement de l'analyser et dire true si elle réussit, et false autrement.

+1

ʀᴇɢᴜʟᴀʀ sᴍᴇɢᴍᴜʟᴀʀ. Utilisez donc une meilleure bibliothèque de correspondance de modèles. Astuce: Python peut aussi correspondre à '(. *) \ 1', ce qui n'est pas non plus normal. . – tchrist

+2

Hm .. droite. Pourtant, je ne crois pas que les expressions régulières soient le bon outil pour cela ... et vous? – aioobe

+0

Non, pas vraiment. – tchrist

2

Vous devez utiliser un analyseur d'expressions réel. Voici une question sur l'expression d'analyse syntaxique Python:

Math Expression Evaluation

Et voici le lien de la meilleure réponse:

http://effbot.org/zone/simple-top-down-parsing.htm

+0

* J'ai la fonction d'analyser les mathématiques * - On dirait qu'il a déjà un analyseur ... – aioobe

+0

Je ne suis pas sûr. Quelle fonction d'analyseur est là qui peut analyser l'expression mais ne vous dit pas si elle a réussi ou non? Je ne suis pas sûr de ce qu'il a réellement. – steveha

+0

Je pense qu'il veut dire qu'il a une fonction qui peut évaluer une expression analysée. –

10

Vous ne pouvez pas faire ce que vous voulez avec des expressions régulières, Ce n'est pas une langue régulière. Python a des extensions que vous pourriez abuser pour faire ce que vous voulez, mais ce serait impossible à maintenir et ne vous apporterait rien de plus que l'utilisation d'un analyseur.

Ce que vous voulez est un analyseur, une grande bibliothèque facile à utiliser pour Python est appelée pyparsing.

Voici un answer with a pyparsing example associé.

+0

+1, bonne réponse :-) – aioobe

+2

pyparsing est absolument le bon outil pour le travail ici. L'analyse de grammaires simples et irrégulières est précisément la tâche à laquelle Pyparsing excelle. –

0

Pour l'analyse du texte mathématique, reverse polish notation est souvent utilisé. Si vous obtenez votre entrée dans cette syntaxe, vous pouvez utiliser une fonction python RPN pour le lire. Pour un analyseur RPN en python, soit this soit this semble prometteur.

Si vous êtes l'écriture de votre propre langage de programmation, vous pouvez simplement forcer l'utilisateur à utiliser cette notation, et vérifier si elle est pas RPN :)

+1

J'aime RPN moi-même, mais son exemple montre clairement qu'il veut infix. Son exemple: 3 * x^(4 * y) + 1- (7 * y * z/x) – steveha

+0

Je ne suis pas tout à fait sûr de la façon dont vous avez voulu que je prenne ce commentaire. – steveha

+1

Twas une blague: http://www.youtube.com/watch?v=rjQtzV9IZ0Q – tylerthemiler

0

Il se trouve que je peux utiliser une fonction récursive qui reconnaît les lettres et les nombres et ensuite lors de l'analyse des expressions, disons par exemple "x + y", il vérifie si "x" et "y" sont des maths valides. Donc, chaque fois que vous validez une expression, si c'est une lettre ou un chiffre, c'est valide ou si c'est un opérateur avec des choses valides de chaque côté.