一、计算一串字符串的最终值,相当于eval函数功能:
#!/usr/bin/env python # _*_ coding:utf-8 _*_ #Author:chenxz import re def check(s): #检查字符串函数是否合法 s=s.replace(' ','').strip() #去除空格 if len(re.findall('\(',s)) != len(re.findall('\)',s)):#判断括号是否成对 print("括号不匹配") exit() if re.search('(\([*+/])|([*+\-/]\))',s): #判断是否含(*/+ 或+-*/) 这种不合法的 print('格式不正确') exit() return s def count_last(sub_str): #处理n[+-*/]mg格式计算值 sub_str=re.sub('\+-','-',sub_str) #格式化 sub_str=re.sub('--', '+', sub_str) #格式化 if '*' in sub_str: #计算乘 sub_list=sub_str.split('*') res=str(float(sub_list[0])*float(sub_list[1])) elif '/' in sub_str: #计算除 sub_list=sub_str.split('/') res=str(float(sub_list[0])/float(sub_list[1])) elif '+' in sub_str: #计算加 sub_list=sub_str.split('+') res=str(float(sub_list[0])+float(sub_list[1])) elif '-' in sub_str: #计算减 sub_list=sub_str.split('-') res=str(float(sub_list[0])-float(sub_list[1])) return res def count_mid(cal_str): #处理类似(1+3*5)的字符串中间函数 cal_str = cal_str[1:-1] #去除括号 while re.search('\d+\.?\d{0,}[*/]-?\d+\.?\d{0,}',cal_str): #循环匹配乘除 sub_str=re.search('\d+\.?\d{0,}[*/]-?\d+\.?\d{0,}',cal_str).group() res=count_last(sub_str)#子函数计算n[*/]m返回对应值 cal_str=cal_str.replace(sub_str,res)#对应值替代 while re.search('\d+\.?\d{0,}[+\-]-?\d+\.?\d{0,}',cal_str):#循环匹配加减 sub_str=re.search('\d+\.?\d{0,}[+\-]-?\d+\.?\d{0,}',cal_str).group() res=count_last(sub_str)#子函数计算n[+-]m返回对应值 cal_str=cal_str.replace(sub_str,res) #对应值替代 return cal_str s= '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )' s=check(s) #检查输入的合法性 while re.search('\([^()]+\)',s): #循环将最里面的括号找出来 cal_str=re.search('\([^()]+\)',s).group() res=count_mid(cal_str) #最里面的括号和表达式,通过处理函数返回对应值 s=s.replace(cal_str,res) #对应值替代 s=count_mid('(%s)'%s) #去除完括号之后的字符串,加上括号给count_mid函数能自动计算除结果 print(s) #2776677.4952380955