公式计算器(加减乘除法)
#_date:2021/4/19 0019
import re
#判断字符串合法性
def geshi(s):
if re.findall('[a-zA-Z]',s):
print('您的字符串不正确!请修改后再继续。')
flag = False
else:flag = True
return flag
#规范字符串格式
def formats(s):
s = s.replace(' ', '')
s = s.replace('++', '+')
s = s.replace('+-', '-')
s = s.replace('-+', '-')
s = s.replace('*/','/')
s = s.replace('/*','/')
s = s.replace('**','*')
s = s.replace('//','/')
return s
#计算方法函数(乘除法函数)
#相同数字连续相乘除出错
def chengchu(s):
while re.search('[*/]',s):
obj = re.compile('[-]?\d+\.?\d*[*/][-]?\d+\.?\d*')
starts = re.search(obj, s).group()
#接下来进行计算任务
aa = 0
a0 = float(re.split('[*/]',starts)[0])
a1 = float(re.split('[*/]',starts)[1])
if re.search('[*/]',starts).group()=='*':
aa = a0*a1
elif re.search('[*/]',starts).group()=='/':
aa = a0/a1
# 如何只替换第一个匹配对象,其他不替换.
s =
s.replace(starts, str(aa))
# print('替换前的S值:',s)
# print('匹配出来的字符串',starts)
# print('a0=',a0)
# print('a1=',a1)
# print("计算的结果aa:",aa)
# print('替换后s的值:,第一次替换结束',s)
return s
#加减法计算:
def addnum(s):
#对第一个数据为-的数据进行格式化
#相同数字连续相加或相减出错
while re.search('[-]?\d+\.?\d*[+-]\d+\.?\d*',s):
obj = re.compile('[-]?\d+\.?\d*[+-]\d+\.?\d*')
starts = re.search(obj, s).group()
strs = starts
a0=re.search('[-]?\d+\.?\d*',strs).group()
strs = strs.replace(a0,'')
a1=re.search('[-]?\d+\.?\d*', strs).group()
aa= float(a0)+float(a1)
s = s.replace(starts, str(aa))
return s
#程序计算过程主函数
s=input('请输入公式:')
if geshi(s)==False:
print('原始s=',s)
s = input('请重新输入:')
st = formats(s)
print('原始的',st)
#循环判断是否扣号:
#判断是否有乘除法:
while st.count('(')>0:
ret = re.search('\([^()]*\)', st).group()
print(ret)
ret1=ret
while re.search('[*/+-]', ret1):
if re.search('[*/]',ret1):
ret1 = chengchu(ret1)
print(ret1)
elif re.search('[+-]',ret1):
ret1 = addnum(ret1)
print(ret1)
ret1 = ret1.replace(ret1, ret1[1:-1])
print('旧的ret',ret)
print('新的ret1',ret1)
st= st.replace(ret,ret1)
print(st)
#---------------------------
while re.search('[*/+-]', st):
if re.search('[*/]',st):
st = chengchu(st)
elif re.search('[+-]',st):
st = addnum(st)
print(st)
浙公网安备 33010602011771号