计算器-- 利用re模块 利用函数封装 第二版
1 import re 2 remove_parentheses = re.compile('\([^()]+\)') 3 4 def Remove_Parentheses(obj, s): # 找到内层的括号并且返回单个括号 5 while obj.search(s): 6 ret = obj.search(s).group() 7 if ('*'in ret) or ('/' in ret): # 判断括号里是否有乘法 除法 8 ret1 = ride_div(ret) # 有则调用 ride_div() 函数 9 s = s.replace(ret, ret1) # 把乘法后的返回值进行重新赋值, 在乘法的函数里 还调用了加减法的函数, 详情看往下看. 10 else: 11 ret2 = add_sub(ret) # 若没有 乘除法 则直接调用 加减法的函数 add_sub() 12 s = s.replace(ret, ret2) #把加减法后的返回值 重新赋值. 13 return s 14 15 16 def ride_div(s): # 求乘除法的值 17 while re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?', s): #用 search判断 若不是None则继续进行 18 minus(s) # 此函数是为了把 -- -+ +- ++ 替换成 单个的 19 ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?', s).group() 20 a, d ,b = re.split('([/*])', ret) 21 if d == '*': 22 sum = float(a) * float(b) 23 s = s.replace(ret, str(sum)) # 把得到的积 重新赋值 24 elif d == '/': 25 sum = float(a) / float(b) 26 s = s.replace(ret, str(sum)) # 把得到的商 重新赋值 27 else: 28 ret_new = add_sub(s) # 此处是为了当while 条件为None时 调用加减法, 把值相加或相减 29 return ret_new.strip('(').strip(')') # 最后得到一个数字 进行返回 30 31 32 33 def add_sub(s): # 求加减的值 34 while re.search('-?\d+(\.\d+)?[+-]-?\d+(\.\d+)?', s): 35 s = minus(s) 36 ret = re.search('(?P<a>-?\d+(\.\d+)?)(?P<d>[+-])(?P<b>-?\d+(\.\d+)?)', s) # 此处,因为用切割的话 会有bug, 所以选择了用 分组的命名 37 a = ret.group('a') 38 d = ret.group('d') 39 b = ret.group('b') 40 if d == '+': 41 sum = float(a) + float(b) 42 elif d == '-': 43 sum = float(a) - float(b) 44 s = s.replace(ret.group(0), str(sum)) 45 s = s.strip('(').strip(')') 46 return s 47 48 49 def minus(s): #更改 不和谐的 符号 50 while ('--' in s) or ('-+' in s) or ('+-' in s) or ('++' in s) : 51 s = s.replace('--','+') 52 s = s.replace('-+','-') 53 s = s.replace('+-','-') 54 s = s.replace('++','+') 55 return s 56 57 58 def main(): # 主函数 59 while 1: 60 s = input('请输入你要计算的式子,输入回车退出程序:').strip().replace(' ', '') 61 if not s: 62 break 63 if "(" in s: 64 ret1 = Remove_Parentheses(remove_parentheses, s) 65 ret2 = ride_div(ret1) 66 ret3 = add_sub(ret2) 67 print(ret3) 68 else: 69 ret2 = ride_div(s) 70 ret3 = add_sub(ret2) 71 print(ret3) 72 73 main()