2011-09-01 119 views
1

我在Python中创建一种编程语言,我缺少基本语言的一个主要组件是解析数学方程的能力。我有函数来解析数学,但我需要能够检查输入是否是数学方程。我正在寻找一个正则表达式来匹配类似3 * x ^(4 * y)+ 1-(7 * y * z/x)的东西。Python数学正则表达式

+2

虽然正则表达式可能会检查这样的输入,但我怀疑你可以依靠它来验证方程。 –

+4

不,正则表达式甚至不能*检查*如果它在语法上是正确的。 – aioobe

+0

@aioobe:仅仅因为Python的模式不能完成任务并不意味着没有人能做到。 [很多](http://stackoverflow.com/questions/4840988/the-recognizing-power-of-modern-regexes/4843579#4843579)。你知道这个。请停止喋喋不休。 – tchrist

回答

2

我正在寻找一个正则表达式匹配类似3*x^(4*y)+1-(7*y*z/x)

你不能有一个匹配的字符串,如正则表达式 “3 *的x ^(4 * Y)...”。平衡括号的语言只是而不是regular

(实际上,是Python特定的正则表达式时,上面是一个谎言。不过,虽然,我会声称,正则表达式将是这个任务的错误的工具。)

我有功能解析数学...

如果你有一个解析器,我建议你只是尝试分析它,并说true如果它成功,否则false

+1

ʀᴇɢᴜʟᴀʀsᴍᴇɢᴍᴜʟᴀʀ。因此,请使用更好的模式匹配库。提示:Python也可以匹配'(。*)\ 1',这也是不正常的。 。 – tchrist

+2

嗯..没错。尽管如此,我并不认为正则表达式是正确的工具......你呢? – aioobe

+0

不,不是真的。 – tchrist

2

您需要使用实际的表达式分析器。这是一个关于表达的问题在Python解析:

Math Expression Evaluation

这里是最好的答案的链接:

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

+0

*我有功能解析数学* - 似乎他已经有一个解析器... – aioobe

+0

我不确定。什么解析器函数可以解析表达式,但不会告诉你它是否成功?我不确定他实际上有什么。 – steveha

+0

我认为他意味着他有一个函数可以评估解析的表达式。 –

10

你不能做你想用正则表达式是什么,它不是一种常规的语言。 Python有扩展,你可以滥用做你想做的事情,但它将是不可维护的,并不会让你得到任何关于使用解析器。

你想要的是一个解析器,一个非常易于使用的Python库被称为pyparsing

这里是一个相关的answer with a pyparsing example

+0

+1,很好的回答:-) – aioobe

+2

pyparsing绝对是这里工作的正确工具。解析简单的不规则文法正是pyparsing擅长的任务。 –

0

对于解析数学文本,经常使用reverse polish notation。如果你用这种语法得到你的输入,那么你可以使用RPN python函数来读取它。

对于Python中的RPN解析器,thisthis看起来很有前途。

如果你正在写你自己的编程语言,你可以简单地强制用户使用这个符号,并检查它不是在RPN :)

+1

我自己喜欢RPN,但他的例子清楚地表明他想要中缀。他的例子:3 * x ^(4 * y)+ 1-(7 * y * z/x) – steveha

+0

我不太清楚你打算如何采取这个评论。 – steveha

+1

Twas a joke:http://www.youtube.com/watch?v=rjQtzV9IZ0Q – tylerthemiler

0

原来我可以使用识别字母递归函数和数字,然后当解析表达式时,比如说“x + y”,它会检查“x”和“y”是否是有效的数学运算。所以,无论何时验证表达式,如果它是一个字母或数字,它都是有效的,或者如果它是一个在任何一方都有效的东西的操作符。