基于正则和迭代模式的计算器源码

源码如下:

 1 # encoding:utf-8
 2 # Author:"richie"
 3 # Date:2017/8/8
 4 import re
 5 # 待处理数据
 6 s =  '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'
 7 pat_bracket = re.compile(r"""([^(]*?)""", re.X)  # 过滤括号内的算数表达式
 8 pat_divmod = re.compile(r"""d+.?d*[*/]-?d+.?d*""", re.X) # 过滤乘除算数表达式
 9 pat_add = re.compile(r"""-?d+.?d*[+-]-?d+.?d*""", re.X) # 过滤加减算术表达式
10 
11 
12 def my_sum(str_inner_new,ret = 0):
13     """
14     基本算数运算函数
15     :param str_inner_new: 一个数学表达式字符串
16     :param ret: 返回的默认参数
17     :return: 返回运算结果 以字符串形式
18     """
19     # 如果传入的表达式中含有'--'则用'+'替换
20     str_inner_new = str_inner_new.replace('--', '+') if '--' in str_inner_new else str_inner_new
21 
22     if '*' in str_inner_new: # 表达式为乘法运算
23         number_l = str_inner_new.split('*') 
24         ret = float(number_l[0]) * float(number_l[1])
25     elif '/' in str_inner_new:# 表达式为除法运算
26         number_l = str_inner_new.split('/')
27         ret = float(number_l[0]) / float(number_l[1])
28     elif re.search('[-+]', str_inner_new) is not None: # 表达式为加法和减法运算
29         number_l = str_inner_new.split('+') if '+' in str_inner_new else  str_inner_new.replace('-', ' -').split()
30         ret = sum([float(i) for i in number_l]) 
31     return str(ret)
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_divmod.search(data) is None and pat_add.search(data) is None :
42         return data.replace('--', '')
43     if pat.search(data) is not None and pat == pat_bracket:  # 如果找到括号内容
44         str_inner = re.sub(r'[()]', '', pat.search(data).group(0)) # 去除表达式括号
45         # 运算括号内的表达式,求出结果,然后用运算结果替换括号表达式内容
46         return my_eval(pat, data.replace(pat.search(data).group(0), my_eval(pat_divmod, str_inner)))
47     elif pat == pat_bracket: # 如果data中找不到括号内容,则运算乘除法或加减法
48         return my_eval(pat_divmod, data) if pat_divmod.search(data) is not None else my_eval(pat_add, data)
49     elif pat.search(data) is None: # 如果没有括号,没有乘除法,则运算加减法
50         return my_eval(pat_add, data)
51     ret = my_sum(pat.search(data).group(0))  # 运算基本表达式结果
52     return my_eval(pat, data.replace(pat.search(data).group(0), ret))
53 # 输出表达式运算结果
54 print(eval(s), my_eval(pat_bracket, s))
原文地址:https://www.cnblogs.com/richiewlq/p/7359866.html