Python实例---利用正则实现计算器[FTL版]
import re # 格式化 def format_str(str): str = str.replace('--', '+') str = str.replace('-+', '-') str = str.replace('+-', '-') str = str.replace('*+', '*') str = str.replace('/+', '/') str = str.replace('++', '+') str = str.replace(' ', '') # 表达式检查 def check_exp(str): ret = True # 匹配括号 if not str.count('(') == str.count(')'): print("表达式错误,括号未闭合") ret = False if re.findall('[a-z]+', str.lower()): print('表达式错误,非法字符!!!') ret = False return ret # 计算乘除法 (30 + 6 * 2) def cal_mul_div(str): # 取出第一个乘法或者除法的表达式 regular = '\d+\.?\d*([*/]|\*\*)[\-]?\d+\.?\d*' while re.findall(regular, str): # 获取表达式 expr = re.search(regular, str).group() # 计算乘法 if expr.count('*') == 1: # 获取要计算的2个数字 x, y = expr.split('*') # 计算乘法 mul_result = str(float(x) * float(y)) # 结果替换表达式 str = str.replace(expr, mul_result) str = format_str(str) # 计算除法 elif expr.count('/') == 1: # 获取要计算的2个数字 x, y = expr.split('/') # 计算乘法 div_result = str(float(x) / float(y)) # 结果替换表达式 str = str.replace(expr, div_result) str = format_str(str) # 计算幂次方 elif expr.count('*') == 2: # 获取要计算的2个数字 x, y = expr.split('*') # 计算幂次方 pow_result = 1 for i in range(int(y)): pow_result *= int(x) # 结果替换表达式 str = str.replace(expr, str(pow_result)) str = format_str(str) return str # 加减法运算 def cal_div_sub(str): # 取出第一个乘法或者除法的表达式 add_regular = '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*' sub_regular = '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*' # 计算加法 add_list = re.findall(add_regular, str) for add_str in add_list: x, y = add_str.split('+') add_result = "+" + str(float(x) + float(y)) str = str.replace() return str # 计算减法 sub_list = re.findall(sub_regular, str) for sub_str in sub_list: if __name__ == '__main__': ss = '1 - 2 * ((60 - 30 + (-40/5) * (9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14)) - (-4 * 3) / (16 - 3 * 2))' if check_exp(ss): print('Source:', ss) print('eval result:', eval(ss)) ss = format_str(ss) print('Format result:', ss) # 判断是否右括号 while ss.coumt('(') > 0: # 取出括号 str = re.search('\([^()]*\)', ss).group() # 将括号的表达式进行乘法除法运算 replace_str = cal_mul_div(str) # 将运算结果进行加法减法运算 replace_str = cal_div_sub(replace_str) # 将括号的字符串替换为计算结果,结果包含(),替换时去掉():[1:-1] ss = format_str(ss.replace(str, replace_str[1:-1])) else: replace_str = cal_mul_div(ss) # 将运算结果进行加法减法运算 replace_str = cal_div_sub(replace_str) # 将括号的字符串替换为计算结果,结果包含(),替换时去掉():[1:-1] ss = ss.replact(ss, replace_str) print("Final result:", ss.replace('+', ''))
【更多参考】
作者:小a玖拾柒
-------------------------------------------
个性签名: 所有的事情到最後都是好的,如果不好,那說明事情還沒有到最後~
本文版权归作者【小a玖拾柒】和【博客园】共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!