首页 > 代码库 > 基于正则和迭代模式的计算器源码
基于正则和迭代模式的计算器源码
源码如下:
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))
基于正则和迭代模式的计算器源码
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。