思路:学会运用正则表达式把需要先进行计算的匹配出来,然后再一步步的去算,把先算出来的值替换原来的值,再进一步的把++,--等号变成我们正常的数学上的符号,然后再进行一步步的替换,最终把带括号的都计算出来,再调用一次加减函数进行计算

import re

def atom_cal(exp):      #计算乘除法
if "*" in exp:
a,b = exp.split("*") #以*作切割,把切出来的两个值分别赋给a,b
return str(float(a) * float(b)) #用float计算ab相乘的值并转换成字符串格式,便于计算
else:
a,b = exp.split("/") #以/作切割,把切出来的两个值分别赋给a,b
return str(float(a) / float(b)) def mul_div(exp): #乘除
while 1:
ret = re.search("\d+(\.\d+)?[*/]-?\d+(\.\d+)?",exp) #把乘除法匹配出来
if ret:
atom_exp = ret.group() #取第一个组匹配出来的乘除法
res = atom_cal(atom_exp) #调用atom_cal函数计算乘除法
exp = exp.replace(atom_exp,res) #替换 将计算出来的值与原式子替换
else:return exp #当没有相匹配的乘除法时,返回exp def format_exp(exp): #改变符号
exp = exp.replace("--","+")
exp = exp.replace("-+","-")
exp = exp.replace("+-","-")
exp = exp.replace("++","+")
return exp def add_sub(exp): #计算加减
ret = re.findall("[+-]?\d+(?:\.\d+)?",exp) #把能加减的匹配出来,包括小数,负数等
exp_sum = 0
for i in ret:
exp_sum += float(i) #累加至exp_sum中返回
return exp_sum def cal(exp):
exp = mul_div(exp) #乘除
exp = format_exp(exp) #变号
exp_sum = add_sub(exp) #加减
return exp_sum #float def main(exp):
exp = exp.replace(" ","")#去空格
while 1:
ret = re.search("\([^()]+\)",exp) #括号最里面的数
if ret:
inner_bracket = ret.group() #取正则表达式匹配到的第一个组数
res = str(cal(inner_bracket)) #调用cal计算
exp = exp.replace(inner_bracket,res) #把算出来的值返回给括号
exp = format_exp(exp) #调用函数,变号
else:break
return cal(exp)
s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
print(main(s))

最新文章

  1. Intellij Idea 2016 配置Tomcat虚拟目录
  2. GIT ON WINDOWS
  3. [家里蹲大学数学杂志]第432期Hardy type inequalities
  4. sql和access中截取字符串的区别
  5. Ubuntu 12.04+DarwinStreamingSrvr6.0.3 架设流媒体服务器
  6. 继承Animation
  7. AE与AO的区别
  8. 51中的C语言数据类型
  9. 使2个div 在一行上显示
  10. SQL Server 数据库索引
  11. ios页面跳转
  12. NeuChar 平台使用及开发教程(六):成为开发者
  13. java 简单程序
  14. 压力(性能)测试及jmeter的使用
  15. showDialog 必须Stateful
  16. linux 常用命令及实例
  17. Java反射基础知识
  18. [20180828]exadata--豆腐渣系统的保护神.txt
  19. CSS 模块的侦测
  20. 转: Linux mount/unmount命令

热门文章

  1. C++中的构造函数小结
  2. 19.Imagetragick 命令执行漏洞(CVE-2016–3714)
  3. Ubuntu12.04更新出现 The system is running in low-graphics mode解决方法
  4. Codeforces - 1181B - Split a Number - 贪心
  5. cf873F(xjb+二分)
  6. SSM整合文档
  7. TOPOI 测验1320, 问题C: 4410: [CF41D]Pawn 解题报告
  8. FoundToday 隐私政策
  9. ldap第二天-yum安装LDAP + phpLDAPadmin
  10. CentOS 6.6 x64安装TensorFlow