制作计算器

需求:求解有一个+_*/带括号的算式
解题思路
1.拆分计算括号.计算乘除.计算加减
2.利用正则表达式匹配出来需要计算的部分,结果替换掉原算式对应部分
3.最终返回一个计算加减乘除的结果
代码如下:`

import re
#乘除的计算函数
def atom_cal(exp):
	if '*' in exp:
		a,b=exp.split('*')
		return str(float(a)*float(b))
	elif "/" in exp:
		a,b=exp.split('/')
		return str(float(a)/float(b))
#print(atom_cal('3/5'))
#算出结果的表达式,会出现叠加的正负号
def format_exp(exp):
	exp = exp.replace("--","+")
	exp = exp.replace("-+","-")
	exp = exp.replace("++","+")
	exp = exp.replace("+-","-")
	#print(exp)
	return exp

def add_exp(exp):
	ret = re.findall(r'[+-]?\d+(?:\.\d+)?',exp)#?:取消分组优先
	#print(ret)
	exp_sum = 0
	for i in ret:
		exp_sum += float(i)
	return exp_sum
#先匹配出乘除的算式,计算出结果替换掉,变成纯加减法的算式
def mul_div_exp(exp):
	while True:
		ret = re.search (r'\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp)
		if ret:
			atom_exp = ret.group()
			res = atom_cal(atom_exp)
			#print(atom_exp,res)
			exp = exp.replace(atom_exp,res)
			#print(exp)
		else:
			return exp

def cal(exp):
	exp = mul_div_exp(exp)
	exp = format_exp(exp)
	exp_sum = add_exp(exp)
	return exp_sum

#print(cal('2-1*-22+5/-3+4*6'))

def main(exp):
	exp=exp.replace(' ','')
	#print(exp)
	while 1:
		ret = re.search(r'\([^()]+\)',exp)
		if ret:
			inner_bracket = ret.group()
			res = str(cal(inner_bracket))
			#print(inner_bracket,res)
			exp = exp.replace(inner_bracket,res)
		else:
			return cal(exp)
			
if __name__ == '__main__':
	s='(2-1*-22 + 5/-3+4 *6)* (2-1*-12+5 /-2 + 5*3) +34 /23-14*5'
	print(main(s))

huibif的学习笔记

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值