一、计算一串字符串的最终值,相当于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

最新文章

  1. css实现了hover显示title的效果
  2. CSS3的高级特性
  3. Support Vector Machine (2) : Sequential Minimal Optimization
  4. 更新整理本人所有博文中提供的代码与工具(C++,2013.10)
  5. C++之路进阶——codevs2933(诗人小G)
  6. js setInterval
  7. ABBYY如何使用电子邮件发送OCR结果
  8. Halcon标定步骤
  9. virtualbox 打不开ubuntu解决
  10. SQL Server 外键约束的例子
  11. Android之修改部分字体颜色
  12. 初入angular4——实际项目搭建总结
  13. HTML (Hyper Text Markup Language) 常用标签
  14. interface接口
  15. Linux发行版 CentOS6.5下的分区操作
  16. freemarker报错之十三
  17. 2018.11.04 NOIP训练 小水塘(并查集)
  18. python笔记03:使用字符串
  19. Hadoop整理五(基于Hadoop的数据仓库Hive)
  20. 721. Accounts Merge合并电子邮件账户

热门文章

  1. 浅析word2vec(一)
  2. Oracle导出警告“EXP-00003: 未找到段 (0,0) 的存储定义”解决
  3. 【转】Makefile步步为营
  4. java Reflection(反射)基础知识讲解
  5. JSP开发机票预定系统 源码
  6. Golang模块之HTTP
  7. Linux物理磁盘扩容流程
  8. Protobuf用法
  9. 基于java开发jsp+ssm+mysql实现的在线考试系统 源码下载
  10. jsonArray jsonString list<Object> 之间转换