计算器<代码>

  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                                            # 赋值再次循环用
 
import re
l_no = "-4.0*-4+((-1-8.0*2*-1)-(-9.456/1.57))/8+-8*7"
true_tr = "-4.0*-4+((-1-8.0*2*-1)-(-9.456/1.57))/8+-8*7"
trunswer = eval(true_tr)
print(trunswer)
l = re.sub(" +","",l_no) # 替换 没有+号也能实现 有第四个元素 为替换几次
l_list = list(l) # 还有一个subn方法 会返回一个替换几次的数字
def check_w(formula): # check函数
formula=re.sub("--","+",formula)
formula=re.sub("-+|+-","+",formula) # 管道符号|的意思是or 反斜杠 消除特殊意义
a = re.findall("[a-z]|[A-Z]",formula) # 中括号会消除特殊字符 并且都是or关系
b = re.findall("()",formula) # 找空括号
if a or b:
print("存在字母空括号")
exit()
return formula
l_no = check_w(l_no)
s = l_no
def left_parenthesis(formula): # find the left parenthesis --
a = re.search("(", formula)
if a == None: # 有一种个简单方法“([^()]+)” 中括号消除特殊意思
return None # 但是除了 ^ -三个 “([^()]+)”会匹配括号内容
b = a.span() # 因为findall是优先匹配括号内容
return b[1]
def right_parenthesis(formula): # find the right parenthesis --
a = re.search(")", formula)
if a == None:
return None
b = a.span()
return b[1]
def code_muldiv(numcc): # function for multiplication and division
result = [] # 这是一种算法 所有factor制成列表 所有mathematical symbol
for i in numcc: # -+或者*/)制成一个列表 之后利用列表有顺序来进行计算
jishufuhao = 0 # 正好适合8*-8这种形式
jishushu = 1
fuhao2 = []
num = []
fuhao2 = re.findall("*|/",i)
num = re.split("[*/]",i) # 将所有因数(除数)整理成一个列表
flag2 =True
while flag2:
if fuhao2[jishufuhao] == "*":
ga = float(num[jishushu-1]) * float(num[jishushu])
num[jishushu] = ga
jishushu+=1
jishufuhao+=1
elif fuhao2[jishufuhao] == "/":
ha = float(num[jishushu - 1]) / float(num[jishushu])
num[jishushu] = ha
jishushu += 1
jishufuhao += 1
if jishufuhao+1 > len(fuhao2):
flag2 = False
result.append(num[jishushu-1])
return result
def code_addsub(numcc): # function for addition and subtraction
result = []
for i in numcc:
jishufuhao = 0
jishushu = 1
fuhao2 = []
num = []
i = re.sub("--","+",i)
i = re.sub("+-|-+","-",i)
i = re.sub("^+","",i)
a = re.findall("^-d+.?d*",i) ### 如果formula -9+8 ,这个函数的功能
if a == []: ### 就是将其转换为 0+8-9 这样便将minus
pass ### 转化为无符号式子
else: ###
i = re.sub(a[0],"0",i,1) ###
i = "".join([i,a[0]]) ###
fuhao2 = re.findall("+|-",i)
num = re.split("[+-]",i)
if fuhao2 ==[]:
return numcc
flag2 = True
while flag2:
if fuhao2[jishufuhao] == "+":
ga = float(num[jishushu-1]) + float(num[jishushu])
num[jishushu] = ga
jishushu+=1
jishufuhao+=1
elif fuhao2[jishufuhao] == "-":
ha = float(num[jishushu - 1]) - float(num[jishushu])
num[jishushu] = ha
jishushu += 1
jishufuhao += 1
if jishufuhao+1 > len(fuhao2):
flag2 = False
result.append(num[jishushu-1])
return result
def exchange_l(formula): # for calculating mul div
flag4 = True
while flag4:
need_md = re.findall("d+.?d*[*/]-?d+.?d*",formula)
if need_md == []: # 上边这个正则 是匹配乘除并且两边是3.9这样的数字
break
e = need_md
k = code_muldiv(e)
out_s = formula.replace(str(need_md[0]),str(k[0]))
formula =out_s
return formula
flag2 = True
while flag2:
flag = True
a = 0
y_y=right_parenthesis(s)
if y_y == None: # 判断 没有括号时,直接计算
formula_jj = exchange_l(l)
final_result = code_addsub([formula_jj])
l = l.replace(l, str(final_result[0]), 1)
s = l
print("result:",s)
break
else:
y = right_parenthesis(s) - 1
while flag: # 多次寻找左括号 并且切片后再寻找
position_psis = left_parenthesis(s)
if position_psis == None:
position_psis = 0
break
s= s[position_psis:] # 将找到的左括号后面的字符串切片
a += position_psis # 记录下序列号
if a > y: # 若是左括号序列号比右括号大 则停止寻找
flag = False
a = a - position_psis
need_l = l[a:y] # 需要处理的括号内容
ex_input = l[a - 1:y + 1]
need_l =str(need_l) # 3+2-3
formula_jj = exchange_l(need_l) # 进行乘除处理
final_result = code_addsub([formula_jj]) # 进行加减处理
l = l.replace(ex_input, str(final_result[0]), 1) # 用结果替换掉字符串
s = l # 赋值再次循环用
原文地址:https://www.cnblogs.com/khal-Cgg/p/5872645.html