#!/usr/bin/evn python
ImportRe
defDeal_negative_issue (calc_list):
New_calc_list=[]#定义一个新的空列表, after filtering is complete, put the data into the new list
forIndex,iteminchEnumerate(calc_list):
offItem.strip (). EndsWith ("*")orItem.strip (). EndsWith ("/"):#挑选出以乘号或除号结尾的字符串
New_calc_list.append ("%s-%s"% (calc_list[index],calc_list[index+1]))#拼接字符串 Handling similar 2*5/-3
# elif ("*" or "/") in item: #找出列表中的有乘除的选项, I tried it like a match * in, alone 40/5 this match does not come out
elif("/")inchItemor("*")inchItem
Print(item)
New_calc_list.append (item)
Print("New_calc_ist", new_calc_list)
returnNew_calc_list
defDeal_unusual_issue (Formula):
Formula = Formula.replace ("++","+")
Formula = Formula.replace ("+-","-")
Formula = Formula.replace ("-+","-")
Formula = Formula.replace ("--","+")
Formula = Formula.replace ("- -","+")
returnFormula
# def addition_and_subtraction (Formula):
# sub_calc_list = Re.split ("[+-]", formula)
# sub_operator_list = Re.findall ("[+-]", formula)
# Print (Type (sub_calc_list), sub_operator_list)
# totle_res = None
# for Index,i in Enumerate (sub_calc_list):
# if Totle_res: #sub_res为真, indicating that this is not the first cycle
# if sub_operator_list[index-1]== "+": #通过sub_operator_list中的index判断到底是加法还是减法
# Totle_res + = float (i)
# Else:
# Totle_res-= float (i)
# Else:
# sub_res = float (i)
# Print (totle_res)
defCalculating (Formula):
Print("Operations", formula)
Calc_list = Re.split ("[+-]", formula)#通过 +-symbol separates individual multiplication operations
Calc_list = Deal_negative_issue (calc_list)
Print(calc_list)
forIteminchCalc_list:
Sub_calc_list = Re.split ("[*/]", item)
Sub_operator_list = Re.findall ("[*/]", item)#将乘号除号通过列表方式分隔出来
Print(sub_calc_list,sub_operator_list)
Sub_res =None
forIndex,iinchEnumerate(sub_calc_list):
ifSub_res:#sub_res为真, which means it's not the first cycle.
ifsub_operator_list[index-1]=="*":#通过sub_operator_list中的index判断到底是加法还是减法,
Sub_res *=float(i)
Else:
Sub_res/=float(i)
Else:
Sub_res =float(i)
Print("[%s]=]%item,sub_res)
Formula = Formula.replace (item,Str(Sub_res))
Formula = Deal_unusual_issue (Formula)
Print(Formula)
#计算 +-method
Totle_calc_list = Re.split ("[+-]", formula)
Totle_operator_list = Re.findall ("[+-]", formula)# Multiplication Sign Division sign separated by a list
Print(Totle_calc_list, Totle_operator_list)
Totle_res =None
forIndex,iteminchEnumerate(totle_calc_list):
ifTotle_res:#sub_res为真, which means it's not the first cycle.
iftotle_operator_list[index-1]=="+":#通过sub_operator_list中的index判断到底是加法还是减法,
Totle_res + =float(item)
Else:
Totle_res-=float(item)
Else:
Totle_res =float(item)
# return Formula
Print("[Result]=], Totle_res)
returnTotle_res
defCalc (Formula):
Parentheses_flag =True
Calc_res=None
whileParentheses_flag:
m = Re.search ("\([^()]*\)", formula)#找出最底层的括号, one for a
Print(m)
ifM:
# Print (Type (M.group ()))
Subformula = M.group (). Strip ("()")#把找出来的括号剥离
Subres = Calculating (Subformula)
Formula = Formula.replace (M.group (),Str(Subres))
Else:
Print("no brackets.")
Print("The end result is", calculating (Formula))
Parentheses_flag =False
if__name__ = =' __main__ ':
res = Calc ("1-2 * ((60-30 + (9-2*5/-3 + 7/3*99/4*2998 +10 * 568/14) * (40/5))-(4*3)/(16-3*2))")
#res = Calc ("2 * (40/5)")
#备注: -40/5 function not implemented
This article is from the "Open World" blog, so be sure to keep this source http://voidyao000.blog.51cto.com/12458042/1908712
Python Learning Regular expression exercise: writing a calculator