#_author:来童星#date:2019/11/10source='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 check(s): flag=True if re.findall('[a-zA-Z]',source):#if re.findall('[a-z]',s.lower()): print('表达式错误,包含非法字符') flag=False if not s.count('(')==s.count(')'): print('表达式错误,括号未闭合') flag=False return flag#做格式化处理def format(s): s=s.replace(' ','') s=s.replace('++','+') s=s.replace('-+','-') s = s.replace('++', '+') s = s.replace('+-', '-') s = s.replace('--', '+') s = s.replace('/+', '/') return sdef cal_mul_div(s):#(2+0.5*3.9) # 从字符串中获取一个乘法或除法的表达式 regular='[\-]?\d+\.?\d* [*/] [\-]?\d+\.?\d*' #(30+6*2+9/3) #如果还能找到乘或除法表达式 while re.findall(regular,s): # 获取表达式 express=re.search(regular,s).group()# 6*2 9/3 #检测是乘法还是除法 if express.count('*')==1 : #获取要计算的两个数 x, y = express.split('*') #计算结果 result=str(float(x) * float(y)) #将计算的表达式替换为计算结果值 s=s.replace(express,result)# s=(30+12+9/3) #格式化 s = format(s) #如果是除法 if express.count('/'): # 获取要计算的两个数 x, y = express.split('/') # 计算结果 result1 = str(float(x) / float(y)) s=s.replace(express, result1)# s=(30+12+3) s=format(s) return sdef cal_add_sub(s): regular_add='[\-]?\d+\.?\d* + [\-]?\d+\.?\d*' regular_sub='[\-]?\d+\.?\d* - [\-]?\d+\.?\d*' #开始加法 while re.findall(regular_add,s): #把所有的加法都算完,获取所有加法表达式 add_list=re.findall(regular_add,s) for add_str in add_list: #获取两个加法的数 x, y = add_str.split('+') add_result='+'+str(float(x)+float(y)) s=s.replace(add_str,add_result) s=format(s) # 开始减法 while re.findall(regular_sub, s): # 把所有的减法都算完,获取所有减法表达式 sub_list = re.findall(regular_sub, s) for sub_str in sub_list: numbers=sub_str.split('-') #-3-5的情况split会返回3个之 if len(numbers)==3: result=0 for v in numbers: if v: result-=float(v) else: x,y=numbers result=float(x)-float(y) #替换字符串 s = s.replace(sub_str,result) s = format(s) # 获取两个减法的数 # x, y = sub_str.split('-') # sub_result = '+' + str(float(x) + float(y)) # s = s.replace(sub_str, sub_result) # s = format(s) # # x,y=ret1.split('[*/]',ret1) # #检测是加法还是减法 # if '+' in ret1: # ret2=float(x)+float(y) # str(ret2) # s.replace(ret1,ret2) # else: # ret2=float(x)-float(y) # str(ret2) # s.replace(ret1,ret2) # # return s#(17)if check(source): print('source',source) print('eval result',eval(source)) strs=format(source) print('source', source)# 处理带括号的 while source.count('(')>0:# re.search('\(') #去括号,得到括号的字符串,结果如(30+6/3) strs=re.search('\([^()]*\)',source).group() #将括号的表达式进行乘除运算 replace_strs=cal_mul_div(strs) # 将括号的表达式进行加减运算 replace_strs=cal_add_sub(replace_strs) # '(17)' #将括号的字符串替换为计算结果,结果包含(),替换时去点():[1:-1] source=format(source.replace(strs,replace_strs[1:-1]))#处理不带括号的 else: replace_strs = cal_mul_div(source) replace_strs = cal_add_sub(replace_strs) print('my resule',source.replace('+',''))
来源:https://www.cnblogs.com/startl/p/11832100.html