计算器

使用re模块将下面的表达式计算出来

expression='1-2*((60+2*(-3-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'

  1 # -*- coding:utf-8 -*-
  2 import re
  3 
  4 # expression='1-2*((60+2*(-3-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'
  5 # expression='1 -2*10*(-9-2*5/3+7/3*99/4*2998+10*568/14)-(-4*3)/(16-3*2)'
  6 # content=re.search('(([-+*/]*d+.?d*)+)',expression).group() #(-3-40.0/5)
  7 
  8 def add_sub(bracket_content_after_md): #加减法
  9     print("处理加法运算: %s" %bracket_content_after_md)     #-3-8.0
 10 
 11     if re.search('(d+.?d*)((+-)|(--))(d+.?d*)',bracket_content_after_md):     #提取+- -- 表达式
 12         first_add_sub = re.search('(d+.?d*)((+-)|(--))(d+.?d*)', bracket_content_after_md).group()  # 提取加减法表达式
 13         # print(first_add_sub)    #60+-3818009.3809523815
 14 
 15         #加减为减,减减为加
 16 
 17         if re.search('+',first_add_sub):   #如果有+ 那么就是+-,就可以转换为-
 18             first_add_sub = first_add_sub.replace('+','')
 19             # print(first_add_sub)
 20 
 21         elif re.search('--',first_add_sub):   #如果为--,则转换为+
 22             first_add_sub = first_add_sub.replace('--', '+')
 23             # print(first_add_sub)
 24 
 25         first_add_sub_dig = re.split('+|-', first_add_sub)  # 将数字和+ - 号分离
 26         # print(first_add_sub_dig)    #['3', '8.0']
 27 
 28         if bracket_content_after_md[0] == '-':  # 加个负号判断
 29             first_dig = -float(first_add_sub_dig[0])  # 如果第一位是负号,这将第一个数字变为负数
 30             bracket_content_after_md = bracket_content_after_md[1:]  # 将这个负号去掉,因为已经变成负数了
 31             # print(bracket_content_after_md)
 32         else:
 33             first_dig = float(first_add_sub_dig[0])
 34         # print(first_dig)    #3.0
 35         second_dig = float(first_add_sub_dig[1])
 36         # print(second_dig)   #8.0
 37         first_add_sub_sym = re.findall('[+-]', first_add_sub)  # 提取运算符号
 38         # print(first_add_sub_sym)    #['-']
 39 
 40         if '-' in first_add_sub_sym:  # 判断运算符并进行真实运算
 41             result_add_sub = first_dig - second_dig
 42             # print(result_add_sub,print(type(result_add_sub)))
 43             result_add_sub_str = str(result_add_sub)  # 将结果转化为字符串
 44             # print(result_add_sub_str,type(result_add_sub_str))      #-5.0 <class 'str'>
 45         else:  # 加法进行下面的操作和上面除法操作一样
 46             result_add_sub = first_dig + second_dig
 47             # print(result_add_sub,print(type(result_add_sub)))
 48             result_add_sub_str = str(result_add_sub)  # 将结果转化为字符串
 49             # print(result_add_sub_str, type(result_add_sub_str))  # -5.0 <class 'str'>
 50 
 51         # print(bracket_content_after_md,type(bracket_content_after_md),first_add_sub,type(first_add_sub),type(result_add_sub_str))
 52         #60+-3818009.3809523815 <class 'str'> 60-3818009.3809523815 <class 'str'> <class 'str'>
 53         #下面要进行替换操作
 54 
 55         bracket_content_after_md = result_add_sub_str
 56         # print(bracket_content_after_md,result_add_sub_str)
 57         return add_sub(bracket_content_after_md)
 58 
 59     elif re.search('(d+.?d*)[+-](d+.?d*)', bracket_content_after_md):
 60         first_add_sub = re.search('(d+.?d*)[+-](d+.?d*)', bracket_content_after_md).group()     #提取加减法表达式
 61         # print(first_add_sub,type(first_add_sub))        #3-8.0 <class 'str'>
 62         first_add_sub_dig = re.split('+|-', first_add_sub)    #将数字和+ - 号分离
 63         # print(first_add_sub_dig)    #['3', '8.0']
 64 
 65         if bracket_content_after_md[0] == '-':      #加个负号判断
 66             first_dig = -float(first_add_sub_dig[0])    #如果第一位是负号,这将第一个数字变为负数
 67             bracket_content_after_md = bracket_content_after_md[1:]   #将这个负号去掉,因为已经变成负数了
 68             # print(bracket_content_after_md)
 69         else:
 70             first_dig = float(first_add_sub_dig[0])
 71         # print(first_dig)    #3.0
 72         second_dig = float(first_add_sub_dig[1])
 73         # print(second_dig)   #8.0
 74         first_add_sub_sym = re.findall('[+-]',first_add_sub)     #提取运算符号
 75         # print(first_add_sub_sym)    #['-']
 76 
 77         if '-' in first_add_sub_sym:        #判断运算符并进行真实运算
 78             result_add_sub = first_dig - second_dig
 79             # print(result_add_sub,print(type(result_add_sub)))
 80             result_add_sub_str = str(result_add_sub)  # 将结果转化为字符串
 81             # print(result_add_sub_str,type(result_add_sub_str))      #-5.0 <class 'str'>
 82         else:   #加法进行下面的操作和上面除法操作一样
 83             result_add_sub = first_dig + second_dig
 84             # print(result_add_sub,print(type(result_add_sub)))
 85             result_add_sub_str = str(result_add_sub)  # 将结果转化为字符串
 86             # print(result_add_sub_str, type(result_add_sub_str))  # -5.0 <class 'str'>
 87 
 88         bracket_content_after_as = bracket_content_after_md.replace(first_add_sub, result_add_sub_str)  #替换运算结果
 89 
 90         bracket_content_after_md = bracket_content_after_as
 91 
 92         return add_sub(bracket_content_after_md)    ##迭代处理加减
 93 
 94     else:
 95         return bracket_content_after_md  ##迭代处理加减
 96 
 97 def mul_div(bracket_content):   #乘除法--处理括号内所有乘除法
 98     print("处理乘法运算: %s" %bracket_content)  #-3-40.0/5
 99 
100     if re.search('(d+.?d*)((*-)|(/-))(d+.?d*)',bracket_content):        #提取并处理*-,/-,
101         first_mul_div = re.search('(d+.?d*)((*-)|(/-))(d+.?d*)', bracket_content).group()
102         first_mul_div_dig = re.split('((*-)|(/-))', first_mul_div)
103         # print(first_mul_div)    #2*-11.0
104         first_mul_div_dig = re.split('*|/', first_mul_div)     #提取乘法运算的两个数字
105         # print(first_mul_div_dig)    #['2', '-11.0']
106         first_dig = float(first_mul_div_dig[0])  # 提取第一个数字并转化格式
107         # print(first_dig)    #2.0
108         second_dig = float(first_mul_div_dig[1])   # 提取第二个数字并转化格式
109         # print(second_dig)
110         first_mul_div_sym = re.findall('[*/]', first_mul_div)  # 提取运算符号
111         # print(first_mul_div_sym)
112         if '/' in first_mul_div_sym:    #判断运算符并进行真实运算
113             result_mul_dig = first_dig / second_dig
114             # print(result_mul_dig,print(type(result_mul_dig)))
115             result_mul_dig_str = str(result_mul_dig)    #将结果转化为字符串
116             # print(result_mul_dig_str,type(result_mul_dig_str))
117         else:   #乘法进行下面的操作和上面除法操作一样
118             result_mul_dig = first_dig * second_dig
119             # print(result_mul_dig)
120             result_mul_dig_str = str(result_mul_dig)
121             # print(result_mul_dig_str, type(result_mul_dig_str))
122 
123         bracket_content_after_md = bracket_content.replace(first_mul_div,result_mul_dig_str)    #替换运算结果
124         # print(bracket_content_after_md)     #-3-8.0
125 
126         bracket_content = bracket_content_after_md
127         # print(bracket_content)
128 
129         return mul_div(bracket_content)     #迭代处理乘除
130 
131     elif re.search('(d+.?d*)[*/](d+.?d*)',bracket_content):
132         first_mul_div = re.search('(d+.?d*)[*/](d+.?d*)',bracket_content).group()   #提取第一个带有次乘除符号表达式 40.0/5,group将对象转为字符串
133         # print(first_mul_div,print(type(first_mul_div)))    #40.0/5
134 
135         first_mul_div_dig = re.split('*|/',first_mul_div)     #提取乘法运算的两个数字
136         # print(first_mul_div_dig)    #['40.0', '5']
137         first_dig = float(first_mul_div_dig[0])     #提取第一个数字并转化格式
138         # print(first_dig,type(first_dig))        #40.0 <class 'float'>
139         second_dig = float(first_mul_div_dig[1])
140         # print(second_dig, type(second_dig))     #5.0 <class 'float'>
141 
142         first_mul_div_sym = re.findall('[*/]',first_mul_div)      #提取运算符号
143         # print(first_mul_div_sym,type(first_mul_div_sym[0]))        #['/']
144 
145         if '/' in first_mul_div_sym:    #判断运算符并进行真实运算
146             result_mul_dig = first_dig / second_dig
147             # print(result_mul_dig,print(type(result_mul_dig)))
148             result_mul_dig_str = str(result_mul_dig)    #将结果转化为字符串
149             # print(result_mul_dig_str,type(result_mul_dig_str))
150         else:   #乘法进行下面的操作和上面除法操作一样
151             result_mul_dig = first_dig * second_dig
152             # print(result_mul_dig)
153             result_mul_dig_str = str(result_mul_dig)
154             # print(result_mul_dig_str, type(result_mul_dig_str))
155 
156         bracket_content_after_md = bracket_content.replace(first_mul_div,result_mul_dig_str)    #替换运算结果
157         # print(bracket_content_after_md)     #-3-8.0
158 
159         bracket_content = bracket_content_after_md
160         # print(bracket_content)
161 
162         return mul_div(bracket_content)     #迭代处理乘除
163 
164     else:       #返回处理乘除后结果
165         return bracket_content
166 
167         # add_sub(bracket_content_after_md)   #调用加减法
168 
169 def deep_bracket(expression): #处理小括号
170     if re.search('(([-+*/]*d+.?d*)+)',expression):     #有小括号则提取并处理
171         bracket = re.search('(([-+*/]*d+.?d*)+)',expression).group()   #提取第一个小括号
172         # print(bracket)  #(-3-40.0/5)
173         bracket_content= bracket.split("(")[1].split(")")[0]    #去除括号
174         # print(bracket_content)  #-3-40.0/5
175         bracket_content_after_md = mul_div(bracket_content)    #调用乘除法函数,先算乘除
176         # print(bracket_content_after_md,type(bracket_content_after_md))      #9-3.3333333333333335+173134.50000000003+405.7142857142857 <class 'str'>
177 
178         print('=======================')
179         bracket_content_after_as = add_sub(bracket_content_after_md)    #此为第一个小括号的计算结果,调用加减法函数,算加减法
180         # print(bracket_content_after_as)     #173527.88095238098
181 
182         expression = expression.replace(bracket,bracket_content_after_as)
183         print("表达式为: %s" %expression)
184 
185         deep_bracket(expression)
186 
187     else:   #没有小括号交给乘法和加法处理
188         # mul_div(expression)
189         bracket_content_after_md = mul_div(expression)      #先调用乘除函数
190         bracket_content_after_as = add_sub(bracket_content_after_md)        #再掉用加减函数
191 
192 if __name__ == "__main__":
193     expression = input("请输入表达式>>:")
194     deep_bracket(expression)
原文地址:https://www.cnblogs.com/wangmo/p/7736760.html