利用正则编写简单的计算器
1 # s="1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )" 2 while True: 3 s=input("请输入要计算的数字》》》") 4 import re # 导入re模块 5 def chu_cheng(l): #定义乘除函数 6 l = re.findall(r"(?:\*|\/)?\-?\d+(?:\.\d+)?", l) # 匹配*或者/ 然后有负号匹配负号,后面在加上数字 7 total=float(l[0]) #第一个数字前面肯定是没有乘除号的 8 del l[0] 9 for i in l: #将l里面的第一个元素删除后,就可进行for循环 10 if "/"in i: #判断元素里面是/还是* 11 total = total / float(i.split("/")[1]) 12 if "*" in i: 13 total = total * float(i.split("*")[1]) 14 return "+"+str(total) #加个+的原因是,在提取l的时候会存在将前面的-或+取到,防止计算后是正数而使得与前面数字没办法相加 15 def jia_jian(l): #定义加减函数 16 l=re.findall("[\-\+]?\d+(?:\.\d+)?",l) #将传进来的l进行匹配,匹配模式为 前面的符号加上数字 17 total=0 18 for i in l: #依次循环相加 19 total+=float(i) 20 return str(total) 21 def xuan_ze(i): #定义判断函数,选择根据有无乘除号选择计算的函数 22 if "*" in i or "/" in i: 23 l = re.search(r"((\-|\+)?\d+(\.\d+)?(\*|\/))+(\-|\+)?\d+(\.\d+)?", i).group() 24 #匹配带有乘除号的式子,数字前面的负号也会取到 25 tu = chu_cheng(l) #调用乘除函数 26 i = tu.join(i.split(l)) #将i以l进行分割,然后再将计算的结果tu替换l, **重点:有相同的l全部替换 27 return xuan_ze(i) #递归,将i中所有带有/或*的部分全部进行运算 28 else:return jia_jian(i) #在没有*或/后,调用加减函数 并将计算结果返回 29 while True: #循环 30 # dic={" ": "", r"\-\-": "+", r"\-\+": "-", r"\+\+": "+", r"\+\-": "-"} #*************************其他思路 31 # for i, j in dic.items(): #注:对于必须替换"++,-+,+-,--,空格"这种情况,在必须替换时可用这种思路 32 # s = re.sub(i, j, s) 33 s=re.sub(" ", "", s) #去除传入的s中空格 34 s=re.sub(r"\-\-", "+",s)#如果存在--将其转换为+号,**注:+-不影响,因为在每次取值时,我都会取前面的符号,+-的话,加号无意义 35 # 重点:不会存在-+(除非sb输入)的情况,因为在去括号的时候,进行加减操作后,+号会被去掉的 36 if "("in s: #如果有括号,进行寻找括号里面数据的操作 37 res=re.search(r"\([^()]+\)",s).group() #只匹配里面括号里面无括号的数据 38 i=xuan_ze(res) #调用选择函数,进行判断有无乘除号 39 s=i.join(s.split(res)) #将原式子以res进行分割,并将计算结果i替换进去 40 else: #在没有括号的情况下 41 s=xuan_ze(s) #调用选择函数,进行判断计算 42 break #结束循环 43 print(s) #打印