正则计算器2

 1 import sys
 2 import re
 3 
 4 def deal_fuhao(calc_list):
 5     new_calc_list=[]
 6     for index,item in enumerate(calc_list):
 7         if item.strip().endswith('*') or item.strip().endswith('/'):
 8             new_calc_list.append('%s-%s'%(calc_list[index],calc_list[index+1]))
 9         elif ('*'or'/') in item:
10             new_calc_list.append(item)
11     print(new_calc_list)
12     return new_calc_list
13 
14 def jianfa(formula):
15     print('运算',formula)
16     print(formula)
17     formula = formula.replace('+-', "-")
18     formula = formula.replace('++', "+")
19     formula = formula.replace('-+', "-")
20     formula = formula.replace('--', "+")
21 
22     calc_list=re.split('[+-]',formula)
23     sub_calc_list = re.findall('[+-]', formula)
24     print(calc_list,sub_calc_list)
25     sub_res=None
26     for index,item in enumerate(calc_list):
27         if sub_res: #这不是第一次
28             if sub_calc_list[index-1]=="-":
29                 sub_res -= float(item)
30             else:
31                 sub_res += float(item)
32         else:
33             sub_res=float(item) #这里其实就是赋值,然后用于上边的计算
34     print('\033[31;1m[%s]\033[0m' %sub_res)
35     print(eval(formula))
36 def chengchu(formula):
37     print('运算',formula)
38     calc_list=re.split('[+-]',formula)
39     calc_list =deal_fuhao(calc_list)
40     print(calc_list)
41 
42     for item in calc_list:
43         sub_calc_list=re.split('[*/]',item)
44         sub_operator_list=re.findall('[*/]',item)
45         print(sub_calc_list,sub_operator_list)
46         sub_res=None
47         for index,i in  enumerate(sub_calc_list):
48             if sub_res: #这不是第一次
49                 if sub_operator_list[index-1]=='*':
50                     sub_res *= float(i)
51                 else:
52                     sub_res /= float(i)
53             else:
54                  sub_res = float(i)
55 
56         print('\033[31;1m[%s]=\033[0m'%item,sub_res)
57         formula = formula.replace(item,str(sub_res))
58 
59     print('\033[31;1m[%s]结果\033[0m',formula)
60     res_zuizhong =jianfa(formula)
61 
62 def calc(formula):
63     parentheses_flag = True
64     while parentheses_flag:
65         m=re.search('\([^()]+\)',formula)
66         if m:
67             print(m.group())
68             sub_formula=m.group().strip('()')
69             sub_res=chengchu(sub_formula)
70         break
71 
72 if __name__=='__main__':
73     formula = '1-2*(60-30+ (-40.0/5*(9-2*5/-3+7/3*99/4*2998+10*568/14)))-(-4*3)/(16-3*2)'
74     res = calc(formula)
 1 C:\Users\qiangql\AppData\Local\Programs\Python\Python36-32\python.exe C:/Users/qiangql/PycharmProjects/untitled1/计算器2.py
 2 (9-2*5/-3+7/3*99/4*2998+10*568/14)
 3 运算 9-2*5/-3+7/3*99/4*2998+10*568/14
 4 ['2*5/-3', '7/3*99/4*2998', '10*568/14']
 5 ['2*5/-3', '7/3*99/4*2998', '10*568/14']
 6 ['2', '5', '-3'] ['*', '/']
 7 [2*5/-3]= -3.3333333333333335
 8 ['7', '3', '99', '4', '2998'] ['/', '*', '/', '*']
 9 [7/3*99/4*2998]= 173134.50000000003
10 ['10', '568', '14'] ['*', '/']
11 [10*568/14]= 405.7142857142857
12 [%s]结果 9--3.3333333333333335+173134.50000000003+405.7142857142857
13 运算 9--3.3333333333333335+173134.50000000003+405.7142857142857
14 9--3.3333333333333335+173134.50000000003+405.7142857142857
15 ['9', '3.3333333333333335', '173134.50000000003', '405.7142857142857'] ['+', '+', '+']
16 [173552.54761904766]
17 173552.54761904766
18 
19 Process finished with exit code 0
运算结果

 

posted @ 2018-04-24 12:56  人无远虑  阅读(195)  评论(0编辑  收藏  举报