import re,time
# 1.先循环括号
# 2.算括号的乘除,后算加减
s ='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
def reduce_sysbol(name): #"+-" 或 "-+" 换成-
if re.search("(\+\-|\-\+|\-\-)",name):
return re.sub("(\+\-|\-\+|\-\-)","-",name)
return name
def calculation(front,sign,back):
if sign == "*":
return (float(front) * float(back))
elif sign == "/":
return (float(front) / float(back))
elif sign == "+":
return (float(front) + float(back))
else:
return (float(front) - float(back))
def priority(name):
obj = name.strip("()") #两边括号取消
obj = reduce_sysbol(obj)
while True:
if re.search("(?P<front>\d+\.*\d*)(?P<sign>[*/])(?P<back>\-*\d+\.*\d*)",obj): #先找乘除
a = re.search("(?P<front>\d+\.*\d*)(?P<sign>[*/])(?P<back>\-*\d+\.*\d*)",obj)
b = calculation(a.group("front"),a.group("sign"),a.group("back"))
obj = obj.replace(a.group(),str(b))
continue
elif re.search("(?P<front>\-*\d+\.*\d*)(?P<sign>[+-])(?P<back>\-*\d+\.*\d*)",obj):
a = re.search("(?P<front>\-*\d+\.*\d*)(?P<sign>[+-])(?P<back>\-*\d+\.*\d*)",obj)
b = calculation(a.group("front"), a.group("sign"), a.group("back"))
obj = obj.replace(a.group(), str(b))
else:
return obj
def run(arg):
obj = arg.replace(" ", "")
while True:
if re.search("\([^()]+\)",obj): #找括号里面没有括号的
sea_brackets = re.search("\([^()]+\)",obj)
jieguo = priority(sea_brackets.group())
obj = obj.replace(sea_brackets.group(),str(jieguo))
else:
jieguo = priority(obj)
if re.search("^\-*\d+\.*\d*",obj):
print(jieguo)
exit()
obj = obj.replace(sea_brackets.group(),str(jieguo))
print(obj)
if __name__ == '__main__':
run(s)