Python利用正则表达式实现计算器算法思路解析-创新互联
(1)不使用eval()等系统自带的计算方法
创新互联公司为企业提供:品牌网站建设、网络营销策划、成都小程序开发、营销型网站建设和网站运营托管,一站式网络营销整体服务。实现不断获取潜在客户之核心目标,建立了企业专属的“营销型网站建设”,就用不着再为了获取潜在客户而苦恼,相反,客户会主动找您,生意就找上门来了!(2)实现四则混合运算、括号优先级解析
思路:
1、字符串预处理,将所有空格去除
2、判断是否存在括号运算,若存在进行第3步,若不存在则直接进入第4步
3、利用正则表达式获取最底层括号内的四则运算表达式
4、将四则运算表达式进行预处理:表达式开头有负数时,在表达式前加上一个0
5、利用re.split()、re.findall()方法,通过加减符号,对四则运算进行拆分为乘除运算式和数字,并保留对应的位置下标。
6、利用re.split()、re.findall()方法,通过乘除符号,将乘除式拆分为乘除符号与数字,然后进行计算,并返回数值。
7、通过re.split()、re.findall()保留的下标位置,将表达式还原。
8、完成所有乘除运算之后,返回进行加减运算。
9、完成加减运算后,返回表达式进行替代。
10、通过递归函数,完成所有括号运算后。最后再完成一次四则运算即可完成所有运算。
注:在过程中,负数的处理存在三个要点:当负数出现在表达式开头、负数前面存在减法、乘除式中存在负数且不在表达式开头。
(1)当负数出现在表达式开头:在前面加上一个0
(2)负数前面存在减法:每次完成一次运算后需要进行一次符号检查替换
(3)乘除式中存在负数且不在表达式开头:将负号移到表达式最开头
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Dang import re def update_formula(calc_list,calc_operator_list): # 通过拆分后的表达式列表与符号列表重新组合 for index,item in enumerate(calc_list): if index == 0: formula = item elif index != 0: formula += calc_operator_list[index-1] + item return formula def negative_start_issue(formula): #处理负数在括号内表达式开头的情形 calc_list = re.split("[+-]",formula) #通过+-符号将各个乘除运算分隔出来 calc_operator_list = re.findall("[+-]",formula) for index,item in enumerate(calc_list): if index == 0 and item == '': # 处理负号在开头的问题 calc_list[index] = '0' else: calc_list[index] = item.strip() formula = update_formula(calc_list,calc_operator_list) return formula def deal_unusual_issue(formula): # 双加减符号处理 formula = formula.replace(" ","") #去掉空格 formula = formula.replace("++","+") formula = formula.replace("+-", "-") formula = formula.replace("-+", "-") formula = formula.replace("--", "+") return formula def deal_negative_issue(formula): # 处理乘除运算中负数的计算问题(分前后位置两种情况) # 1.负数在后 m = re.search("[0-9]+[.]*[0-9]*[*|/][-][0-9]+[.]*[0-9]*",formula) # minus_pre = re.search("[0-9]+[.]*[0-9]*[*|/][-][0-9]+[.]*[0-9]*",formula).group() # 注意匹配的必要项与非必要项,如:"[0-9]+[.][0-9]+[*|/][-][0-9]+[.][0-9]+"误把非必要项当做必要项。 if m: minus_pre = m.group() minus_pro = "-"+minus_pre.replace("-","") formula = formula.replace(minus_pre,minus_pro) if "*-" in formula or "/-" in formula: return deal_negative_issue(formula) # 2.负数在前 formula = deal_unusual_issue(formula) return formula def multiply_divide(formula): # print("[%s]"%formula,formula) # 乘除计算 calc_list = re.split("[*/]", formula) operator_list = re.findall("[*/]", formula) # 将乘号除号通过列表方式分隔出来 # print("sub_calc_list:", sub_calc_list) # print("sub_operator_list:", sub_operator_list) res = 0 for index2, i in enumerate(calc_list): if index2 == 0: res = float(i) else: if operator_list[index2 - 1] == '*': # 通过sub_operator_list中的index判断到底是加法还是减法, res *= float(i) elif operator_list[index2 - 1] == '/': res /= float(i) return res def add_abstract(formula): # 加减计算 # 1.开头位置负数处理 formula = negative_start_issue(formula) # 2.双加减符号处理 formula = deal_unusual_issue(formula) # 3.加减逻辑运算 calc_list = re.split("[+-]", formula) operator_list = re.findall("[+-]", formula) res = 0 for index, i in enumerate(calc_list): if index == 0: res = float(i) else: if operator_list[index-1] == '+': res += float(i) elif operator_list[index-1] == '-': res -= float(i) return res """
网页名称:Python利用正则表达式实现计算器算法思路解析-创新互联
转载注明:http://scyanting.com/article/dgppjp.html