#coding:utf-8 import re #正则表达式计算器 #检测错误(1)括号匹配(2)运算符检查 (3)非法字符 #查找括号,乘除,加减。 #运算 #主函数替换 # ret=re.findall('\([^()]+\)',s) # 审核小括号 def check_k(s): tag = 0 for x in s: if x == '(': tag += 1 elif x == ')': tag -= 1 if tag < 0: break if tag == 0: return 1 else: raise Exception('算式错误') #运算符检查 def check_f(s): s=s.replace('++','+') s=s.replace('--', '+') s = s.replace('+-', '-') s=s.replace('-+','+') return s def count(s_sub): # 处理乘除,直到没有乘除号,注意负号和小数点 ret=re.search('(-?\d+\.?\d*)([*/])(-?\d+\.?\d*)', s_sub) #直至内部无乘除运算后停止 while ret!=None: num_1 = ret.group(1) sign = ret.group(2) num_2 = ret.group(3) if sign == '*': num = float(num_1) * float(num_2) if sign == '/': num = float(num_1) / float(num_2) num = str(num) s_sub = s_sub.replace(ret.group(), num) ret=re.search('(-?\d+\.?\d*)([*/])(-?\d+\.?\d*)', s_sub) #处理加减,直至内部无加减运算后停止 ret=re.search('(-?\d+\.?\d*)([+-])(\d+\.?\d*)', s_sub) while ret!=None: num_1 = ret.group(1) sign = ret.group(2) num_2 = ret.group(3) if sign == '+': num = float(num_1)+float(num_2) if sign == '-': num = float(num_1)-float(num_2) num = str(num) s_sub = s_sub.replace(ret.group(), num) ret = re.search('(-?\d+\.?\d*)([+-])(\d+\.?\d*)', s_sub) return s_sub s='1-2*((60-30+(-40/5)*(9-2*6/3+4*2998+10*568/2))-(-4*3)/(16-3*2))' check_k(s) #找到最内部括号 s_kuohao=re.findall('\([^()]+\)',s) while s_kuohao!=[]: #能匹配到内部括号继续循环 for x in s_kuohao: #去括号 s_sub=x[1:-1] #处理加减乘除,返回处理过的括号内容 tihuan=count(s_sub) s=s.replace(x,tihuan) #处理负号冲突 s=check_f(s) s_kuohao=re.findall('\([^()]+\)',s) s=count(s) print(s)
【练习】正则表达式计算器
最新推荐文章于 2025-01-09 18:40:33 发布