#!/usr/bin/env python
#-*-coding=utf-8 -*-
#GKX
import re
def dealwith(express):
'''
将表达式中 ‘+-’替换为 - --替换为+
:param new_express: 计算完原子型表达式后的主表达式
:return:
'''
express:express = express.replace('+-','-')
express:express = express.replace('--','+')
return express
def cal_exp_son(exp_son):
'''
计算原子型表达式 两个数之间的乘除法
:param exp_son: 传进来的,只有两个数之间的乘除法
:return: 返回计算后的值
'''
if '/' in exp_son:
a,b = exp_son.split('/') # -40/5
return str(float(a)/float(b))
elif '*' in exp_son:
a,b = exp_son.split('*')
return str(float(a)* float(b))
def cal_express_no_bracket(exp):
'''
计算里层不带括号的表达式
:param exp: 最里层不带括号的表达式传进来
:return:
'''
exp = exp.strip('()')
#先乘除后加减
#-40/5*8+2 9-2*5/3+7/3*99/4*2998+10*568/14
while True:
ret = re.search('\d+\.?\d*[*/]-?\d+\.?\d*',exp)
if ret:
exp_son = ret.group() #子表达式 最简单的乘除法
ret = cal_exp_son(exp_son)
exp = exp.replace(exp_son,ret) #ret为计算后的值,替换为 乘除的式子
#111print(exp)
exp = dealwith(exp)
#111print(exp)
else: #当表达式里没有了乘除法
ret = re.findall('-?\d+\.?\d*',exp)
sum = 0
for i in ret:
sum += float(i)
return str(sum)
#提取括号里面没有其他括号的表达式
def remove_bracket(new_express):
while True:
ret = re.search('\([^()]+\)',new_express)
if ret:
express_no_bracket = ret.group()
#111print('匹配到内部不再有括号的值',express_no_bracket) #表达式没括号
ret = cal_express_no_bracket(express_no_bracket)
#print(new_express,express_no_bracket,ret)
new_express = new_express.replace(express_no_bracket,ret)
#print(new_express)
#new_express = dealwith(new_express)
#111print(new_express)
else:
#111print('表达式中没有括号了',new_express)
ret = cal_express_no_bracket(new_express)
#111print(ret)
return ret
#去空格
def calculator(express):
#express = input('表达式')
if express.count('(') != express.count(')'):
print('表达式括号有误,请检查并重新输入')
else:
new_express = re.sub('[\s]','',express) #express.replace(' ','')
#11print(new_express)
res = remove_bracket(new_express)
print(res)
express = '1 - 2 * ( ( (6 0) -3 0 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
calculator(express)
import re
def math(dic):
x,y=float(dic['x']),float(dic['y'])
if dic['mark']=='+':return x+y
elif dic['mark']=='-':return x-y
elif dic['mark']=='*':return x*y
else:return x/y
def suansu(re_str):
ret4=re.search(r'(?P<x>\d+\.?\d*)(?P<mark>[*/])(?P<y>[\-]?\d+\.?\d*)',re_str)
try:
while ret4.group():
re_str=re_str.replace(ret4.group(),str(math(ret4.groupdict())))
if '--' in re_str: re_str =re_str.replace('--','+')
if '++' in re_str: re_str =re_str.replace('++','+')
ret4=re.search(r'(?P<x>\d+\.?\d*)(?P<mark>[*/])(?P<y>[\-]?\d+\.?\d*)',re_str)
except AttributeError:pass
ret4=re.search(r'(?P<x>\d+\.?\d*)(?P<mark>[+\-])(?P<y>[\-]?\d+\.?\d*)',re_str)
try:
while ret4.group():
re_str=re_str.replace(ret4.group(), str(math(ret4.groupdict())))
ret4=re.search(r'(?P<x>\d+\.?\d*)(?P<mark>[+\-])(?P<y>[\-]?\d+\.?\d*)',re_str)
except AttributeError:return re_str
def main(user_inp):
while True:
if not re.search('\([+*/\d.\-]*\)',user_inp):
print(user_inp)
return suansu(user_inp)
else:
for i in re.findall('\([+*/\d.\-]*\)',user_inp):
user_inp=user_inp.replace(i,suansu(i.replace('(','').replace(')','')))
print (user_inp)
a='1 - 2 * ( ( (6 0) -3 0 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
print(main(a.replace(' ','')))