代码如下:
1 # encoding:utf-8 2 # Author:"richie" 3 # Date:8/18/2017 4 5 import re 6 # 待处理数据 7 s = '(1-2)*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*-2998+10*568/14))-(-4*3)/(16-3*2))' 8 pat_bracket = re.compile(r"""([^(]*?)""", re.X) # 过滤括号内的算数表达式 9 pat_divmod = re.compile(r"""d+.?d*[*/]-?d+.?d*""", re.X) # 过滤乘除算数表达式 10 pat_add_compute = re.compile(r"""(?P<x>[-]?d+.?d*)(?P<mark>[*/+-])(?P<y>[-]?d+.?d*)""", re.X) 11 12 def my_sum(str_msg,ret = 0): 13 """ 14 基本算数运算函数 15 :param str_msg: 一个数学表达式字符串 16 :param ret: 返回的默认参数 17 :return: 返回运算结果 以字符串形式 18 """ 19 # 如果传入的表达式中含有'--'则用'+'替换 20 str_msg = str_msg.replace('--', '+') if '--' in str_msg else str_msg 21 dic = pat_add_compute.search(str_msg).groupdict() 22 x, y = float(dic['x']), float(dic['y']) 23 if dic['mark'] == '+': 24 return x + y 25 elif dic['mark'] == '-': 26 return x - y 27 elif dic['mark'] == '*': 28 return x * y 29 else: 30 return x / y 31 32 33 def my_eval(pat, data): 34 """ 35 算数运算函数 36 :param pat: 过滤算数运算表达式 37 :param data: 需要运算的表达式 38 :return: 运算结果 39 """ 40 # 当过滤的data中没有括号,没有加减乘除运算表达式,表示已经运算完成,退出函数 41 if pat_bracket.search(data) is None and pat_add_compute.search(data) is None: 42 return data.replace('--', '') 43 if pat.search(data) is not None and pat == pat_bracket: # 如果找到括号内容 44 ret = pat.search(data).group(0) 45 return my_eval(pat, data.replace(ret, my_eval(pat_divmod, ret.strip('()')))) 46 elif pat == pat_bracket: # 如果data中找不到括号内容,则运算乘除法或加减法 47 return my_eval(pat_add_compute, data) 48 elif pat.search(data) is None: # 如果没有括号,没有乘除法,则运算加减法 49 return my_eval(pat_add_compute, data) 50 ret = pat.search(data).group(0) 51 return my_eval(pat, data.replace(ret, str(my_sum(ret)))) 52 # 输出表达式运算结果 53 print(eval(s), my_eval(pat_bracket, s))