1 import re
2 l_no = "-4.0*-4+((-1-8.0*2*-1)-(-9.456/1.57))/8+-8*7"
3 true_tr = "-4.0*-4+((-1-8.0*2*-1)-(-9.456/1.57))/8+-8*7"
4 trunswer = eval(true_tr)
5 print(trunswer)
6 l = re.sub(" +","",l_no) # 替换 没有+号也能实现 有第四个元素 为替换几次
7 l_list = list(l) # 还有一个subn方法 会返回一个替换几次的数字
8 def check_w(formula): # check函数
9 formula=re.sub("--","+",formula)
10 formula=re.sub("-+|+-","+",formula) # 管道符号|的意思是or 反斜杠 消除特殊意义
11 a = re.findall("[a-z]|[A-Z]",formula) # 中括号会消除特殊字符 并且都是or关系
12 b = re.findall("()",formula) # 找空括号
13 if a or b:
14 print("存在字母空括号")
15 exit()
16 return formula
17 l_no = check_w(l_no)
18 s = l_no
19 def left_parenthesis(formula): # find the left parenthesis --
20 a = re.search("(", formula)
21 if a == None: # 有一种个简单方法“([^()]+)” 中括号消除特殊意思
22 return None # 但是除了 ^ -三个 “(([^()]+))”会匹配括号内容
23 b = a.span() # 因为findall是优先匹配括号内容
24 return b[1]
25 def right_parenthesis(formula): # find the right parenthesis --
26 a = re.search(")", formula)
27 if a == None:
28 return None
29 b = a.span()
30 return b[1]
31 def code_muldiv(numcc): # function for multiplication and division
32 result = [] # 这是一种算法 所有factor制成列表 所有mathematical symbol
33 for i in numcc: # (-+或者*/)制成一个列表 之后利用列表有顺序来进行计算
34 jishufuhao = 0 # 正好适合8*-8这种形式
35 jishushu = 1
36 fuhao2 = []
37 num = []
38 fuhao2 = re.findall("*|/",i)
39 num = re.split("[*/]",i) # 将所有因数(除数)整理成一个列表
40 flag2 =True
41 while flag2:
42 if fuhao2[jishufuhao] == "*":
43 ga = float(num[jishushu-1]) * float(num[jishushu])
44 num[jishushu] = ga
45 jishushu+=1
46 jishufuhao+=1
47 elif fuhao2[jishufuhao] == "/":
48 ha = float(num[jishushu - 1]) / float(num[jishushu])
49 num[jishushu] = ha
50 jishushu += 1
51 jishufuhao += 1
52 if jishufuhao+1 > len(fuhao2):
53 flag2 = False
54 result.append(num[jishushu-1])
55 return result
56 def code_addsub(numcc): # function for addition and subtraction
57 result = []
58 for i in numcc:
59 jishufuhao = 0
60 jishushu = 1
61 fuhao2 = []
62 num = []
63 i = re.sub("--","+",i)
64 i = re.sub("+-|-+","-",i)
65 i = re.sub("^+","",i)
66 a = re.findall("^-d+.?d*",i) ### 如果formula为 -9+8 ,这个函数的功能
67 if a == []: ### 就是将其转换为 0+8-9 这样便将minus
68 pass ### 转化为无符号式子
69 else: ###
70 i = re.sub(a[0],"0",i,1) ###
71 i = "".join([i,a[0]]) ###
72 fuhao2 = re.findall("+|-",i)
73 num = re.split("[+-]",i)
74 if fuhao2 ==[]:
75 return numcc
76 flag2 = True
77 while flag2:
78 if fuhao2[jishufuhao] == "+":
79 ga = float(num[jishushu-1]) + float(num[jishushu])
80 num[jishushu] = ga
81 jishushu+=1
82 jishufuhao+=1
83 elif fuhao2[jishufuhao] == "-":
84 ha = float(num[jishushu - 1]) - float(num[jishushu])
85 num[jishushu] = ha
86 jishushu += 1
87 jishufuhao += 1
88 if jishufuhao+1 > len(fuhao2):
89 flag2 = False
90 result.append(num[jishushu-1])
91 return result
92 def exchange_l(formula): # for calculating mul div
93 flag4 = True
94 while flag4:
95 need_md = re.findall("d+.?d*[*/]-?d+.?d*",formula)
96 if need_md == []: # 上边这个正则 是匹配乘除并且两边是3.9这样的数字
97 break
98 e = need_md
99 k = code_muldiv(e)
100 out_s = formula.replace(str(need_md[0]),str(k[0]))
101 formula =out_s
102 return formula
103 flag2 = True
104 while flag2:
105 flag = True
106 a = 0
107 y_y=right_parenthesis(s)
108 if y_y == None: # 判断 没有括号时,直接计算
109 formula_jj = exchange_l(l)
110 final_result = code_addsub([formula_jj])
111 l = l.replace(l, str(final_result[0]), 1)
112 s = l
113 print("result:",s)
114 break
115 else:
116 y = right_parenthesis(s) - 1
117 while flag: # 多次寻找左括号 并且切片后再寻找
118 position_psis = left_parenthesis(s)
119 if position_psis == None:
120 position_psis = 0
121 break
122 s= s[position_psis:] # 将找到的左括号后面的字符串切片
123 a += position_psis # 记录下序列号
124 if a > y: # 若是左括号序列号比右括号大 则停止寻找
125 flag = False
126 a = a - position_psis
127 need_l = l[a:y] # 需要处理的括号内容
128 ex_input = l[a - 1:y + 1]
129 need_l =str(need_l) # 3+2-3
130 formula_jj = exchange_l(need_l) # 进行乘除处理
131 final_result = code_addsub([formula_jj]) # 进行加减处理
132 l = l.replace(ex_input, str(final_result[0]), 1) # 用结果替换掉字符串
133 s = l # 赋值再次循环用