计算器的思路主要是先用正则匹配出括号内的计算,然后用计算的结果将括号及内容整个替换掉,再匹配括号进行计算,替换,直至将括号内的计算全部完成
再者就是需要用正则匹配出乘除法先进行计算,再用正则匹配加减法进行计算,同时需要注意空格及符号的处理,如:++,—,/-,*-,或是负数开头的公式的计算
r"\d+(\.\d+)?/-\d+(\.\d+)?" #匹配3/-2形式的整数或小数的乘除计算 r"\d+(\.\d+)?\*-\d+(\.\d+)?" #匹配3*-2形式的整数或小数的乘除计算 r"\d+(\.\d+)?[/*]\d+(\.\d+)?" #匹配正常的整数或小数的乘除计算 r"-\d+(\.\d+)?-\d+(\.\d+)?" #匹配-3-2形式的整数或小数的加减计算 r"-\d+(\.\d+)?\+\d+(\.\d+)?" #匹配-3+2形式的整数或小数的加减计算
具体如下:
import re # func = "1 - 2 * ((60 - 30 + (-40 / 5) * (9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14)) # - (-4 * 3) / (16 - 3 * 2))" func = " 1+2*-(-3+2)/5.6+3" func = func.replace(" ", "") print(func) print(1+2*-(-3+2)/5.6+3) # 筛选内层括号及括号内容函数 def fun_inside(a): com = re.compile(r"\([^()]+\)") bracket = com.finditer(a) for j in bracket: yield j.group() # 去空格,处理符号函数 def formatting(a): a = a.replace(" ", "") a = a.replace("++", "+") a = a.replace("--", "+") a = a.replace("+-", "-") a = a.replace("-+", "-") a = a.replace("*+", "*") a = a.replace("/+", "/") return a # 括号内的乘除法 def cal_pursue_divide(a): s = re.findall("[*/]", a) s_list = re.split("[*/]", a) res = None for index, j in enumerate(s_list): if res: if s[index - 1] == "*": res *= float(j) elif s[index - 1] == "/": res /= float(j) else: res = float(j) return res # 括号内的加减法 def cal_add_minus(a): s = re.findall("[+-]", a) s_list = re.split("[+-]", a) res = None for index, j in enumerate(s_list): if res: if s[index - 1] == "+": res += float(j) elif s[index - 1] == "-": res -= float(j) else: res = float(j) return res # 四则运算包含特殊的"-","*-","/-","-"开头等 def cal_in_four(a): while True: if re.search(r"[/*]", a): # 先计算乘除法 a = formatting(a) if re.search(r"\d+(\.\d+)?/-\d+(\.\d+)?", a) or \ re.search(r"\d+(\.\d+)?\*-\d+(\.\d+)?", a): # 整数或小数 # 计算 3/-2 类型 if re.search(r"\d+(\.\d+)?/-\d+(\.\d+)?", a): # 整数或小数 result_high = re.search(r"\d+(\.\d+)?/-\d+(\.\d+)?", a) ret = result_high.group().replace("/-", "/") res = cal_pursue_divide(ret) a = a.replace(result_high.group(), "-" + str(res)) # 计算 3*-2 类型 elif re.search(r"\d+(\.\d+)?\*-\d+(\.\d+)?", a): # 整数或小数 result_high = re.search(r"\d+(\.\d+)?\*-\d+(\.\d+)?", a) ret = result_high.group().replace("*-", "*") res = cal_pursue_divide(ret) a = a.replace(result_high.group(), "-" + str(res)) # 正常的乘除计算 else: if re.search(r"\d+(\.\d+)?[/*]\d+(\.\d+)?", a): # 整数或小数 result_high = re.search(r"\d+(\.\d+)?[/*]\d+(\.\d+)?", a) res = cal_pursue_divide(result_high.group()) a = a.replace(result_high.group(), str(res)) # 计算加减法 elif re.search(r"[+-]", a[2:]): a = formatting(a) # 计算"-"开头的加减法 if a[1:].startswith("-") or a.startswith("-"): # 计算 -3-2 类型 if re.search(r"-\d+(\.\d+)?-\d+(\.\d+)?", a): # 整数或小数 result_low = re.search(r"-\d+(\.\d+)?-\d+(\.\d+)?", a) ret = result_low.group()[1:] res = cal_add_minus(ret.replace("-", "+")) a = a.replace(result_low.group(), "-" + str(res)) # 计算 -3+2 类型 elif re.search(r"-\d+(\.\d+)?\+\d+(\.\d+)?", a): # 整数或小数 result_low = re.search(r"-\d+(\.\d+)?\+\d+(\.\d+)?", a) ret = result_low.group()[1:] res = cal_add_minus(ret.replace("+", "-")) a = a.replace(result_low.group(), "-" + str(res)) # 计算正常的加减法 else: if re.search(r"\d+(\.\d+)?[+-]\d+(\.\d+)?", a): # 整数或小数 result_low = re.search(r"\d+(\.\d+)?[+-]\d+(\.\d+)?", a) res = cal_add_minus(result_low.group()) a = a.replace(result_low.group(), str(res)) else: if re.search(r"\d+(\.\d+)?[+-]\d+(\.\d+)?", a): # 整数或小数 result_low = re.search(r"\d+(\.\d+)?[+-]\d+(\.\d+)?", a) res = cal_add_minus(result_low.group()) a = a.replace(result_low.group(), str(res)) return a else: return a # 计算器函数 def calculator(s): while True: if re.search(r"\(.+\)", s): ret_receive_view = fun_inside(s) for i in ret_receive_view: ret = cal_in_four(i).replace("(", "").replace(")", "") s = s.replace(i, ret) else: result = cal_in_four(s) result = formatting(result) s = formatting(result) if s.startswith("+"): return "结果是:" + s[1:] else: return "结果是:" + s sr = calculator(func) print(sr)