描述:
利用正则表达式辨别并提取表达式内加减乘除运算并计算结果
代码如下:
# -*- coding:utf-8 -*-
import re
mul = re.compile(r'(\d+\.?\d*\*-?\d+\.?\d*)') # 创建寻找乘法对象
div = re.compile(r'(\d+\.?\d*/-?\d+\.?\d*)') # 创建寻找除法对象
add = re.compile(r'(-?\d+\.?\d*\+-?\d+\.?\d*)') # 创建寻找加法对象
sub = re.compile(r'(-?\d+\.?\d*-\d+\.?\d*)') # 创建寻找除法对象
find_bracket = re.compile(r'\([^()]+\)') # 创建寻找最内层括号对象
drop_bracket = re.compile(r'[^(].*[^)]') # 创建提取括号内内容对象
check_cal = re.compile(r'\(?\+?-?\d+\)?') # 创建检查是否还有其他运算对象
def Mul(s):
'''提取乘法运算后替换原有表达式'''
m = mul.search(s).group()
n = re.split('\*', m)
return s.replace(m, str(float(n[0]) * float(n[1])))
def Div(s):
'''提取除法运算后替换原有表达式'''
m = div.search(s).group()
n = re.split('/', m)
return s.replace(m, str(float(n[0]) / float(n[1])))
def Add(s):
'''提取加法运算后替换原有表达式'''
m = add.search(s).group()
n = re.split('\+', m)
return s.replace(m, str(float(n[0]) + float(n[1])))
def Sub(s):
'''提取减法运算后替换原有表达式'''
m = sub.search(s).group()
n = re.split('-', m)
if re.match('-', m):
'''如果开头为‘-’,re.split()函数会把表达式分成['', 'dig', 'dig'],所以要处理n[1]和n[2]'''
return s.replace(m, str(- float(n[1]) - float(n[2])))
else:
return s.replace(m, str(float(n[0]) - float(n[1])))
def Sta_exp(s):
'''标准化表达式'''
s = s.replace(" ", "")
s = str('(%s)' % s)
return s
def Calculate(s):
'''
计算流程:
若果有最内层括号存在,先把可能存在的--替换为+
然后计算最内层括号内运算,并在无运算后去除括号
优先级:除>乘>减>加>括号判断 返回float型结果
'''
while find_bracket.search(s):
s = s.replace("--", "+")
exp = find_bracket.search(s).group()
if div.search(exp): s = s.replace(exp, Div(exp))
elif mul.search(exp): s = s.replace(exp, Mul(exp))
elif sub.search(exp): s = s.replace(exp, Sub(exp))
elif add.search(exp): s = s.replace(exp, Add(exp))
elif check_cal.search(exp): s = s.replace(exp, drop_bracket.search(exp).group())
return float(s)
def run():
while True:
exp = input("输入一个正确的表达式或按q退出:\n")
if exp == 'q':
break
else:
exp = Sta_exp(exp)
print("eval函数计算结果:", eval(exp))
print("Calc函数计算结果:", Calculate(exp))
if __name__ == '__main__':
run()
测试结果:
示例1
(2+1)(2+3)+2*6
eval函数计算结果: 27
Calc函数计算结果: 27.0
示例2:
1 - 2 * ( (60-30 +(-40/5) * (9-25/3 + 7 /399/42998 +10 * 568/14 )) - (-43)/ (16-3*2) )
eval函数计算结果: 2776672.6952380957
Calc函数计算结果: 2776672.6952380957