import re
def repeat_func(s):
#去掉重复的+——号
repeat = re.findall('\+\-|\-\-|\++\-\+', s)
if len(repeat) > 0:
for i in repeat:
if i == '--' or i == '++':
s = s.replace(i, '+')
if i == '+-' or s == '-+':
s = s.replace(i, '-')
return s
def mul_devid(content):
# 计算乘除
pattern1 = '-?\d+\.?\d*(?:\*|\/)-?\d+\.?\d*'
while 1:
first = re.search(pattern1, content)
#匹配乘除
if first:
if '*' in first.group():
new1 = first.group().split('*')
new = float(new1[0]) * float(new1[1])
new = str(new)
else:
new1 = first.group().split('/')
new = float(new1[0]) / float(new1[1])
new = str(new)
res=re.search(r'-\d+\.?\d*(?:\*|\/)-\d+\.?\d*',content)
#如果两个负数相乘或相除,添加正号
if res :
new='+' + new
content = repeat_func(content)
content = content.replace(first.group(), new)
else:
break
return content
def add_minus(content):
# 计算加减
pattern2 = '-?\d+\.?\d*(?:\+|\-)\d+\.?\d*'
while 1:
first = re.search(pattern2, content)
if first:
#根据不同的模式分别计算
choice1 = re.search('(-\d+\.?\d*-\d+\.?\d*)', first.group())
if choice1:
new1 = first.group().split('-')
new = -(float(new1[1]) + float(new1[2]))
choice2 = re.search('(-\d+\.?\d*\+\d+\.?\d*)|(\d+\.?\d*\+\d+\.?\d*)', first.group())
if choice2:
new1 = first.group().split('+')
new = float(new1[1]) + float(new1[0])
choice3 = re.search('\d+\.?\d*-\d+\.?\d*', first.group())
if choice3:
new1 = first.group().split('-')
new = float(new1[0]) - float(new1[1])
#
# content=repeat_func(content)
content = content.replace(first.group(), str(new))
else:
break
return content
def calculate(content):
content = mul_devid(content)
content = add_minus(content)
return content
def bracket(s):
while 1:
first = re.search(r'\([^()]+\)', s)
if first:
new=calculate(first.group())
s=s.replace(first.group(),new[1:-1])
s=repeat_func(s)
else: break
end=calculate(s)
return end
s='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(s))
print(bracket(s))