#codeing:UTF-8#__author__:Administrator#date:2018/4/9/009 20:26
source_str = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
#source_str = "1 - 2 "#source_str = "1 - 2 * ( 60-30 +(-40/5) )"
importredefcheck_source(source):
FLAG=Trueif not source.count("(") == source.count(")"):print("Invalid")if re.findall('[a-z]',source.lower()):print("Invalid")#有病的,
FLAG =FalsereturnFLAGdefformate_source(source):
source= source.replace(" ","")
source= source.replace("++","+")
source= source.replace("+-","-")
source= source.replace("*+","*")
source= source.replace("-+","-")
source= source.replace("--","+")
source= source.replace("/+","/")
source= source.replace("//","/")returnsourcedefcal_mul_div(source):
regular= '[\-]?\d+\.?\d*[/*][\-]?\d+\.?\d*'
whilere.search(regular,source):
expression=re.search(regular,source).group()if expression.count("*")==1:
x, y= expression.split("*")
mul_result= "+"+str(float(x)*float(y))
source=source.replace(expression,mul_result)
source=formate_source(source)if expression.count("/")==1:
x, y= expression.split("/")
mul_result= "+"+str(float(x)/float(y))
source=source.replace(expression,mul_result)
source=formate_source(source)#print(source)
returnsourcedefcal_add_sub(source):
add_regular= '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'sub_regular= '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'
#print(re.findall(add_regular,source))#########
while re.findall(add_regular,source):#+
add_list =re.findall(add_regular,source)#print(add_list)
for add_str inadd_list:
x,y= add_str.split("+")
mul_result= "+"+str(float(x) +float(y))
source=source.replace(add_str, mul_result)
source=formate_source(source)while re.findall(sub_regular,source):#-
sub_list =re.findall(sub_regular,source)for sub_str insub_list:
x,y= sub_str.split("-")
mul_result= "+"+str(float(x) -float(y))
source=source.replace(sub_str, mul_result)
source=formate_source(source)returnsourceifcheck_source(source_str):print("source:",source_str)print("eval result:",eval(source_str))
source=formate_source(source_str)print("formate source:",source)while re.search("\(",source):
deal_str= re.search("\([^()]+\)",source).group()#print(deal_str)#
replace_str =cal_mul_div(deal_str)#print(replace_str)#
replace_str = cal_add_sub(replace_str)####
#print(replace_str[1:-1])
source = formate_source(source.replace(deal_str,replace_str[1:-1]))#print(source)
else:
replace_str=cal_mul_div(source)
replace_str=cal_add_sub(replace_str)#print(replace_str[1:-1])
source = formate_source(source.replace(source, replace_str[1:-1]))print("my result :",source)