1. 实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序
import re s='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )' s=s.split() s=''.join(s) print(s) ret=re.findall('((?:[+-]?d+(?:[+-*/]d+)+))',s) #提取最里面的括号 print(ret) for i in ret: i=re.search('-?d+(?:[+-*/]d+)+',i) #提取到的带括号的表达式去除掉括号,只剩下表达式 i=i.group() while re.search('d+[*/]d+',i): expression=re.search('(d+)([*/])(d+)', i) num_1=expression.group(1) sign=expression.group(2) num_2=expression.group(3) if sign=='/': result=int(num_1)/int(num_2) else: result = int(num_1) * int(num_2) i=re.sub('(d+)([*/])(d+)',str(result), i) print(i) while re.search('d+[+-]d+',i): expression = re.search('(d+)([+-])(d+)', i) num_1 = expression.group(1) sign = expression.group(2) num_2 = expression.group(3) if sign == '+': result = int(num_1) + int(num_2) else: result = int(num_1) - int(num_2) i = re.sub('(d+)([+-])(d+)', str(result), i) print(i)
还没写好,但是我有思路了,就是 不断循环,先匹配括号,然后提取括号中的表达式,然后对这个表达式从左往右遍历,匹配*/,先计算乘除,将计算的结果代替原来匹配的正则规则,就是用计算出来的结果代替表达式,然后乘除匹配完之后匹配加减,一直算 然后括号算完 就是循环结束之后 ,就只剩下普通的计算了 和原来思路一样,明天应该能写出来,,,,
我!终于!写出来了!!!
#_+_coding:utf-8_*_ #author: xuanxuan #Time : 2018/9/13 12:43 import re s='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/2 + 9 /3*2/2*2 +10 * 2/4 )) - (-4*3)/ (16-5*2) )' s=s.split() # 按照空格分割,组成一个列表 str--->list s=''.join(s) # 将list-->str ,去除字符串的空格 print('原始表达式:',s) while re.search('(-?d+(?:.d+)?(?:[+-*/]-?d+(?:.d+)?)+)',s): #看这个表达式中存不存在括号 #(-?d+(?:[+-*/]-?d+)+) inner_expression = re.search('(-?d+(?:.d+)?(?:[+-*/]-?d+(?:.d+)?)+)',s).group() # 原来的表达式中 最里层括号内的表达式 expression=re.search('-?d+(?:.d+)?(?:[+-*/]-?d+(?:.d+)?)+',inner_expression).group() # 把最内层括号中的表达式取出来 while re.search('[*/]',expression): sign=re.search('[*/]',expression).group() if sign=='*': num_1=re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)',expression).group(1) num_2=re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)',expression).group(2) result=float(num_1) * float(num_2) expression=re.sub('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)',str(result),expression,1) elif sign=='/': num_1 = re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)', expression).group(1) num_2 = re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)', expression).group(2) result = float(num_1) / float(num_2) expression = re.sub('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)', str(result), expression,1) while re.search('-?d+(?:.d+)?([+-])',expression): sign = re.search('(-?d+(?:.d+)?)([+-])', expression).group(2) if sign=='+': num_1=re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)',expression).group(1) num_2=re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)',expression).group(2) result=float(num_1) + float(num_2) expression=re.sub('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)',str(result),expression,1) elif sign=='-': num_1 = re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)', expression).group(1) num_2 = re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)', expression).group(2) result = float(num_1) - float(num_2) expression = re.sub('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)', str(result), expression,1) s = re.sub('(-?d+(?:.d+)?(?:[+-*/]-?d+(?:.d+)?)+)', expression, s,1) while re.search('[*/]',s): sign=re.search('[*/]',s).group() if sign=='*': num_1=re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)',s).group(1) num_2=re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)',s).group(2) result=float(num_1)*float(num_2) s=re.sub('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)','+'+str(result),s,1) else: num_1 = re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)', s).group(1) num_2 = re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)', s).group(2) result = float(num_1) / float(num_2) s = re.sub('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)', '+'+str(result), s, 1) while re.search('[+-]',s): sign=re.search('[+-]',s).group() if sign=='+': num_1=re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)',s).group(1) num_2=re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)',s).group(2) result=float(num_1)+float(num_2) s=re.sub('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)',str(result),s,1) else: num_1 = re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)', s).group(1) num_2 = re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)', s).group(2) result = float(num_1) - float(num_2) s = re.sub('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)', str(result), s, 1) print(s)
运行结果: