Python:使用正则表达式求解数学表达式

Python:使用正则表达式求解数学表达式,python,regex,python-2.7,Python,Regex,Python 2.7,我想知道是否有可能使用正则表达式来解决简单的数学表达式与实数,运算符+,-,*,/和^ 例如,输入是一个类似“3.5+4^2”的字符串(也可以写成“+3.5+4^2”),输出是19.5。我的想法是让正则表达式首先识别^。所以他会取4^2,然后返回16,所以表达式是“3.5+16”。然后它将识别+并返回19.5 另一个输入示例是-4+5.5*4/2-->-4+22/2-->-4+11-->7正则表达式描述字符串上的模式,它们不能分析整数/浮点数。除非有一个非常隐晦的黑客让它工作(我认为这是不可能的

我想知道是否有可能使用正则表达式来解决简单的数学表达式与实数,运算符+,-,*,/和^

例如,输入是一个类似“3.5+4^2”的字符串(也可以写成“+3.5+4^2”),输出是19.5。我的想法是让正则表达式首先识别^。所以他会取4^2,然后返回16,所以表达式是“3.5+16”。然后它将识别+并返回19.5


另一个输入示例是-4+5.5*4/2-->-4+22/2-->-4+11-->7

正则表达式描述字符串上的模式,它们不能分析整数/浮点数。除非有一个非常隐晦的黑客让它工作(我认为这是不可能的)


可以验证给定字符串是否为有效的数学表达式,但不能使用正则表达式计算数学表达式。

正则表达式描述字符串上的模式,不能分析整数/浮点。除非有一个非常隐晦的黑客让它工作(我认为这是不可能的)

您可以验证给定字符串是否是有效的数学表达式,但不能使用正则表达式计算数学表达式。

正则表达式只匹配,不计算。因此,使用正则表达式匹配字符串是非常好的,类似于

>>> re.match(r'^(?P<n>[0-9]+)(?P<op>[-+\*/])(?P<rest>.+)$', '1+2+3').groupdict()
{'n': '1', 'op': '+', 'rest': '2+3'}
重新匹配(r'^(?P[0-9]+)(?P[-+\*/])(?P.+)$,'1+2+3')。groupdict() {'n':'1','op':'+','rest':'2+3'} 然而,实际的计算最好在Python本身中执行。

正则表达式只是匹配,它们不计算。因此,使用正则表达式匹配字符串是非常好的,类似于

>>> re.match(r'^(?P<n>[0-9]+)(?P<op>[-+\*/])(?P<rest>.+)$', '1+2+3').groupdict()
{'n': '1', 'op': '+', 'rest': '2+3'}
重新匹配(r'^(?P[0-9]+)(?P[-+\*/])(?P.+)$,'1+2+3')。groupdict() {'n':'1','op':'+','rest':'2+3'} 然而,实际计算最好在Python本身中执行。

您可以通过
^
可以替换为
**
,以获得正确的公式

>>> eval('3.5+4^2'.replace('^', '**'))
19.5
>>> eval('-4+5.5*4/2')
7.0
您可以通过
^
可以替换为
**
,以获得正确的公式

>>> eval('3.5+4^2'.replace('^', '**'))
19.5
>>> eval('-4+5.5*4/2')
7.0

有一个著名的符号,你应该用它,波兰符号

正则表达式对您没有多大帮助,因为正则表达式使用的是三,而您想要的计算行的解释将使用三

你可能对三,孩子,叶子,旋转感兴趣。。。行为。
这很像一个scool的例子,用波兰语表示法,用三个结构,你将从左到右顺序阅读你的行,没有正则表达式,有一个著名的表示法,你应该用波兰语表示法

正则表达式对您没有多大帮助,因为正则表达式使用的是三,而您想要的计算行的解释将使用三

你可能对三,孩子,叶子,旋转感兴趣。。。行为。

这非常像一个scool案例,使用波兰语表示法,使用三个结构,您将按照从左到右的顺序读取行,不使用正则表达式,您可以使用
eval
函数<代码>打印评估('3.5+4**2')>19.5我想你只是想玩一下。但是这些表达式并不是根据常规语法构建的。您需要一个支持上下文无关语法的解析器。请参阅示例:@Valijon
eval
是一个糟糕的解决方案,除非您真的知道自己在做什么。您可以使用
eval
函数<代码>打印评估('3.5+4**2')>19.5我想你只是想玩一下。但是这些表达式并不是根据常规语法构建的。您需要一个支持上下文无关语法的解析器。请参阅示例:@Valijon
eval
是一个糟糕的解决方案,除非您真的知道自己在做什么。使用
ast.literal\u eval
而不是
eval
来避免运行恶意/危险代码。使用
ast.literal\u eval
来避免运行恶意/危险代码。但是我可以使用regex来提取^前后的实数,例如,计算它,然后在字符串中替换它,直到我得到一个数字?当然,使用
re.sub
。你也可以先解析整个表达式树,然后对它求值,而不是替换字符串。我在过去的一个小时里一直在努力解决这个问题,但没有取得任何进展。你能帮我吗?也许无关紧要,但也许你能回答。。。。。如果我将顺序ie.-+更改为+-,则表达式不会解析(我使用的是re.compile btw)。为什么会这样?@0xc0de如果
-
位于字符类的最开始或最末尾,则表示文字
-
字符。否则,它表示字符的范围,如
0-6
,它是
0123456
的缩写。就像那样,
[*-/]
[*+,./-]
的简写。但是我可以使用正则表达式提取^前后的实数吗?例如,计算它,然后在字符串中替换它,直到我得到一个数字为止?当然,可以使用
re.sub
。你也可以先解析整个表达式树,然后对它求值,而不是替换字符串。我在过去的一个小时里一直在努力解决这个问题,但没有取得任何进展。你能帮我吗?也许无关紧要,但也许你能回答。。。。。如果我将顺序ie.-+更改为+-,则表达式不会解析(我使用的是re.compile btw)。为什么会这样?@0xc0de如果
-
位于字符类的最开始或最末尾,则表示文字
-
字符。否则,它表示字符的范围,如
0-6
,它是
0123456
的缩写。就像那样,
[*-/]
[*+,./-]
的缩写。