题目: '1 - 2 * ( (60-30 + (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )* (-40/5)) - (-4*3)/ (16-3*2) )' 用re模块解决此问题.
解题思路:1. 按照运算顺序先找到要被优先计算的算式:括号是在所有运算中优先级最高的,所以先要找到所有内部没有括号运算的算式;
2. 在第1步中找到的算式按照运算顺序优先处理乘除法,再计算加减法;
3. 算完内部没有括号的算式后,再以运算顺序循环处理,最终取得结果.
注意事项:1. 初始算式中存在空格,应去除.
2. 注意数字前出现两次运算符号的情况,要注意替换.
下面是计算器代码:
import re def mul_div(atom_exp): ''' 专门负责计算a*b或者a/b这样的表达式的函数 :param atom_exp: a*b或者a/b的表达式 :return:float数据类型的结果 ''' if '*' in atom_exp: a,b= atom_exp.split('*') return float(a) * float(b) elif '/' in atom_exp: a,b = atom_exp.split('/') return float(a) / float(b) def add_sub(no_bracket_exp): ''' 接收一个只有加减法的表达式,计算加减法并返回最终结果 :param no_bracket_exp: 只剩下加减法的表达式 :return:float数据类型的返回值 ''' ret_lst = re.findall('[-+]?\d+(?:\.\d+)?', no_bracket_exp) # [-8] sum_count = 0 for num in ret_lst: sum_count += float(num) return sum_count def exp_format(exp): ''' 负责表达式的整理 :param exp:接收的表达式可能含有 ++ -- +- -+等操作 :return:返回一个没有重叠+-符号的表达式 ''' exp = exp.replace('--','+') exp = exp.replace('+-','-') exp = exp.replace('-+','-') exp = exp.replace('++','+') return exp def cal(no_bracket_exp): ''' 负责计算加减乘除 :param no_bracket_exp: 一个内部不再有括号的表达式 :return: ''' while True: ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',no_bracket_exp) if ret: ret_exp = ret.group() # ret_exp = '2*5' res = str(mul_div(ret_exp)) no_bracket_exp = no_bracket_exp.replace(ret_exp,res) else: break no_bracket_exp = exp_format(no_bracket_exp) sum_count = add_sub(no_bracket_exp) return sum_count def main(exp): exp = exp.replace(' ', '') while True: ret = re.search('\([^()]+\)', exp) if ret: no_bracket_exp = ret.group() ret = str(cal(no_bracket_exp)) exp = exp.replace(no_bracket_exp, ret) else:break return cal(exp) exp = '1 - 2 * ( (60-30 + (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )* (-40/5)) - (-4*3)/ (16-3*2) )' res = main(exp) print(res)