exp= '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7/3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))'
print(eval(exp))
import re
#按照加减乘除找最左边的
def arithmetic(s):
if re.search(r"\(\s{0,}-", s):
ret=re.search(r"(-?\d+(?:\.\d+)?)\s{0,}([-+*/])\s{0,}(-?\d+(?:\.\d+)?)",s)
else:
ret = re.search(r"(\d+(?:\.\d+)?)\s{0,}([-+*/])\s{0,}(-?\d+(?:\.\d+)?)", s)
return ret
#找到乘法和除法
def dd(s):
if re.search(r"\(-",s):
ret = re.search(r"(-?\d+(?:\.\d+)?)\s{0,}([/*])\s{0,}(-?\d+(?:\.\d+)?)", s)
else:
ret = re.search(r"(\d+(?:\.\d+)?)\s{0,}([/*])\s{0,}(-?\d+(?:\.\d+)?)", s)
return ret
#根据传过来的值判断结果
def jia(a,d,b):
a=float(a)
b=float(b)
if d == '+':
return a+b
elif d == '-':
return a-b
elif d == '*':
return a*b
elif d == '/':
return a/b
#找到字符里面的小括号
def xkh(s):
ret=re.search(r"\([^()]+\)",s)
return ret
#第一个参数是最初始字符,
def fff(exp):
sa=xkh(exp) #得到小括号里面的值
if sa:
f = dd(str(sa.group()))#先按照乘法和除法找最左边的
if f:
sum = jia(f.group(1), f.group(2), f.group(3)) # 计算结果
r1 = exp.replace(f.group(), str(sum)) # 替换字符
return r1 #返回替换后的字符
else:
f = arithmetic(str(sa.group()))#按照加减乘除找最左边的
if f:
sum = jia(f.group(1), f.group(2), f.group(3)) # 计算结果
r3 = exp.replace(f.group(), str(sum)) # 替换字符
return r3
else:
ret = re.search("[(](.*)[)]", sa.group())
r2 = exp.replace(ret.group(), ret.group(1)) # 替换字符
return r2
else:
s=dd(exp)#按照乘除法从左边找
if s:
sum = jia(s.group(1), s.group(2), s.group(3)) # 计算结果
r1 = exp.replace(s.group(), str(sum)) # 替换字符
return r1 # 返回替换后的字符
else:
s = arithmetic(exp)#
if s:
sum = jia(s.group(1), s.group(2), s.group(3)) # 计算结果
r1 = exp.replace(s.group(), str(sum)) # 替换字符
return r1 # 返回替换后的字符
#判断是否是小数
def is_float(str):
if str.count('.') == 1: #小数有且仅有一个小数点
left = str.split('.')[0] #小数点左边(整数位,可为正或负)
right = str.split('.')[1] #小数点右边(小数位,一定为正)
lright = '' #取整数位的绝对值(排除掉负号)
if str.count('-') == 1 and str[0] == '-': #如果整数位为负,则第一个元素一定是负号
lright = left.split('-')[1]
elif str.count('-') == 0:
lright = left
else:
return False
if right.isdigit() and lright.isdigit(): #判断整数位的绝对值和小数位是否全部为数字
return True
else:
return False
else:
return False
d1 = exp
while 1:
if is_float(d1):
break
else:
d1 = fff(d1)
print(d1)