基于正则和迭代模式的计算器源码-升级版

代码如下:

 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))

 

posted @ 2017-08-18 12:27  Richie`  阅读(225)  评论(0编辑  收藏  举报