Python小程序之-正则小程序

正则小程序:

给你字符串 '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))' 计算最后结果. 

提示:"-30+(40+5*-2+3/2)*8+   (4- 7) "

计算铺垫

# ### 计算器
import re
strvar = '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'

def calc_exp(strvar):
	if "*" in strvar:
		a,b = strvar.split("*")
		return float(a) * float(b)

	if "/" in strvar:
		a,b = strvar.split("/")
		return float(a) / float(b)

def sign_exp(strvar):
	strvar = strvar.replace("+-","-")
	strvar = strvar.replace("--","+")
	strvar = strvar.replace("++","+")
	strvar = strvar.replace("-+","-")
	return strvar

# "-30+(40+5*-2+3/2)*8+   (4- 7) "
strvar = "-30+(40+5*-2+3/2)*8+   (4- 7) "
strvar = strvar.replace(" ","")
print(strvar) # -30+(40+5*-2+3/2)*8+(4-7)

# 第一步 通过正则匹配最里层的小括号
obj = re.search(r"\([^()]+\)",strvar)
if obj:
	# 第二部:拿取数据
	res1 = obj.group()
	print(res1) # (40+5*-2+3/2)
	
	# 第三部:匹配出乘除表达式 谁*谁 谁/谁
	# obj = re.search(r"\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?" , strvar)
	obj = re.search(r"\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?" , res1)
	res2 = obj.group()
	print(res2) # 5 * -2

	# 第四部:计算出结果
	res3 = str(calc_exp(res2))
	print(res3) # -10.0
	
	# 第五步:把结果替换回原来的字符串
	res4 = res1.replace(res2,res3)
	print(res4) # (40+-10.0+3/2)

	# 第六部:合并多余的符号
	res5 = sign_exp(res4)
	print(res5)
	
	# 重复3 4 5 6 步奏 依次类推 ... 把所有的乘除计算完毕
	
	"""
	当算完乘除之后,再去把括号里面的加减算完,得出最后的结果
	再去替换原来的那个括号整体
	依次类推,直到得出最后的结果...	
	"""

正式计算:

# ### 计算器
import re
strvar = '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'

# 计算乘除
def calc_exp(strvar):
	if "*" in strvar:
		a,b = strvar.split("*")
		return float(a) * float(b)

	if "/" in strvar:
		a,b = strvar.split("/")
		return float(a) / float(b)

# 合并符号
def sign_exp(strvar):
	strvar = strvar.replace("+-","-")
	strvar = strvar.replace("--","+")
	strvar = strvar.replace("++","+")
	strvar = strvar.replace("-+","-")
	return strvar
	
# 计算表达式
def operate_exp(strvar):
	while True:
		obj = re.search(r"\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?" , strvar)
		if obj:
			res1 = obj.group()
			print(res1,"<==1==>") # 5*-2
			# 计算乘除后的结果
			res2 = calc_exp(res1)
			print(res2,"<==2==>") # -10.0
			# 用结果替换原来的表达式
			strvar = strvar.replace(res1,str(res2))
			print(strvar)         # (40+-10.0+3/2)
		else:
			break
			
	# 合并符号
	strvar = sign_exp(strvar)
	print(strvar,"<==3==>") # (40-10.0+1.5) 
	
	# 接下来计算所有的+-法 (40-10.0+1.5) 匹配出所有的数字
	lst = re.findall("[+-]?\d+(?:\.\d+)?",strvar)
	print(lst) # ['40', '-10.0', '+1.5']
	total = 0 
	# 把数字拿出来做累加和
	for i in lst:
		total+= float(i)
	# 返回最后的结果
	return total
			
# 去除小括号
def remove_bracket(strvar):
	while True:
		obj = re.search(r"\([^()]+\)",strvar)
		if obj:
			# 拿取数据
			res1 = obj.group()
			print(res1,"<===>") # (40+5*-2+3/2)
			res2 = operate_exp(res1)
			print(res2,type(res2)) # 31.5 float
			# 替换原来的括号
			strvar = strvar.replace(res1,str(res2))
		else:
			# 返回最后的字符串
			return strvar

# 主函数调用
def main(strvar):
	# 去除原字符串所有的空格
	strvar = strvar.replace(" ","")
	# 去除所有的括号
	strvar = remove_bracket(strvar) 
	# print(strvar , "<===!!!==>") # -30+31.5*8+-3.0 <===!!!==>
	# 计算最后的表达式
	return operate_exp(strvar)
	
# strvar = "-30+(40+5*-2+3/2)*8+   (4- 7) "
res = main(strvar)
print(res) # 2776672.6952380957


print(eval(strvar))

猜你喜欢

转载自blog.csdn.net/qq_45957580/article/details/108294415