'''
开发一个简单的python计算器
实现加减乘除及拓号优先级解析
用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致
hint:
re.search(r'\([^()]+\)',s).group()
'(-40/5)'
'''
import re
# 匹配正数、负数、小数点
regex = re.compile(r'-?\d+\.?\d*')
# 加法减法
def plus_minus(s):
# res = regex.search(s).group()
while re.search(r'[+-]{2,}',s):
s=s.replace('--','+')
s=s.replace('++','+')
s=s.replace('-+','-')
s=s.replace('+-','-')
list_digits = regex.findall(s) # 匹配数字
result = sum(map(float,list_digits))
# s.replace(res,str(result))
# print(s)
result = str(result)
# print(result)
return result
# plus_minus('--3++4-+2+-1')
# 乘除法
def mul_div(s):
while True:
res = re.search(r'\d+\.?\d*[*/][\-+]?\d+\.?\d*', s)
if res is not None:
res = res.group()
result = res
if '*' in res:
a,b = res.split('*')
result = float(a)*float(b)
elif '/' in res:
a,b = res.split('/')
result = float(a)/float(b)
# print(result)
result = str(result)
s = s.replace(res,result)
else:
break
return s
# print(mul_div('2/4*3/5'))
def main(s):
s = s.replace(' ','')
while True:
res = re.search(r'\([^()]+\)',s)
if res is not None:
resu = res.group() # 有括号 (1+2*3+4)
result = mul_div(resu)
result = plus_minus(result)
# result = result[1:-1]
s = s.replace(resu, result)
else:
s = mul_div(s)
s = plus_minus(s)
break
return s
if __name__ == '__main__':
equation = '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'
print(main(equation))
开发一个简单的python计算器
最新推荐文章于 2022-11-21 09:58:12 发布