需求 a.实现加减乘除及拓号优先级解析 b.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ),计算结果
import re
def mul_div(m_d): # 计算乘除公式
for index, member in enumerate(m_d):
if "*" in member or "/" in member:
oper = re.findall("[*/]", member)
calculation = re.split("[*/]", member)
num = None
for i, e in enumerate(calculation):
if num:
if oper[i - 1] == "*":
num *= float(e)
elif oper[i - 1] == "/":
num /= float(e)
else:
num = float(e)
m_d[index] = num
return m_d
def add_sub(oper, num_list): #计算加减公式
num = None
for i, n in enumerate(num_list):
if num:
if oper[i - 1] == "+":
num += float(n)
elif oper[i - 1] == "-":
num -= float(n)
else:
num = float(n)
return num
def brackets(formula): #格式化计算公式
formula = re.sub("[()]", "", formula) # 去除两边的()
formula = formula.replace(" ", "") # 去除空字符
formula = formula.replace("+-", "-") # 定义计算规则,正负得负
formula = formula.replace("--", "+") # 定义计算规则,负负得正
sign = re.findall("[+-]", formula) # 取出公式内加减运算符
m_d = re.split("[+-]", formula) # 以加减运算符切割计算公式,取出带有'*' '/'
if m_d[0] == "": # 如果列表第一个字符为空,表示一个数字为负号
m_d[1] = "-" + m_d[1] # 重新定义带有*/的公式,加上负号
del sign[0]
del m_d[0]
for index, member in enumerate(m_d): #枚举列表
if member.endswith("*") or member.endswith("/"):
m_d[index] = member + sign[index] + m_d[index + 1]
del m_d[index + 1]
del sign[index]
res=sign, m_d
sign = res[0]
m_d = res[1]
after_m_d = mul_div(m_d)
res = add_sub(sign, after_m_d)
return res
def main(formula): # 主逻辑,循环取出括号内计算公式并进行公式拼接
while True:
formula_cut = re.search("\([^()]+\)", formula)
if formula_cut:
formula_cut = formula_cut.group()
res = brackets(formula_cut) # 格式化计算公式
formula = formula.replace(formula_cut, str(res)) # 把括号计算后的内容拼接到计算公式
else:
res = brackets(formula)
print("\33[31;1m结果:%s\33[0m" % (res))
exit()
formula=input('''
请输入运算公式:
格式如:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
【Q】 退出
''')
if formula.lower() == 'q':
print('计算器已退出')
exit()
main(formula)
测试效果 请输入运算公式: 格式如:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) 【Q】 退出 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) 结果:2776672.6952380957
转载于:https://blog.51cto.com/lyndon/1955313