Python基于正则表达式实现计算器功能


Posted in Python onJuly 13, 2020

计算表达式:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )的结果。

解题思路:

  • 第1步:创建一个函数search_bracket_exp,通过re.rearch找到括号里面的表达式,传入到第二个函数用于表达式计算。返回一个新的表达式。express.replace(括号中的内容,第2步回的结果)
  • 第2步:创建一个函数get_no_bracket_express,先去掉括号。然后通过re.reacher找到带有乘和除的符号并计算结果。计算出的结果,express.replace(去掉括号中的内容,第3步返回的结果),如果表达式再也找不到乘除符号,则会剩下类似于9+-8--7+3+10这样的表达式,对这个的表达式+-,--处理成-,+,然后变成9-8+7+3+10,对该表达式进行re.findall等到一个List,遍历这个list,进行累加即可。
  • 第3步:创建一个函数mul_div,只对乘除进行计算,并返回结果。
  • 第4步:调试中发现,从第1点的括号全部处理完毕后,会等到1-2*-1388335.8476190479,这个时候再次调用第2步创建的get_no_bracket_express,即能返回最终的结果。

代码如下:

import re

def son_deal(exp): #此处类似于8+-9——10++9 8+9+10-11
  if '--'or '+-' in exp:
    exp= exp.replace('--','+') #'1-2*60-30+-8.0.0-10.0.0+2.3.300000000000002e+4.74950.0+5680.0.0--12.0.0-6.0'
    exp= exp.replace('+-','-')
    return exp
def add_minus_func(exp):
  lst = re.findall('-?\d*\.?\d*', exp)
  sum = 0.0
  if len(lst)==0:
    sum=float(exp)
  else:
    new_lst = filter(None, lst)
    for l in new_lst:
      l = float(l)
      sum += l
  return str(sum)
def mul_div(exp):
  print('ab值前的表达式:%s'%exp)
  if '*' in exp:
    a,b=exp.split('*')
    return str(float(a)*float(b))
  if '/' in exp:
    a, b = exp.split('/')
    print('a的值是%s,b的值是%s'%(a,b))
    print ('除后的结果:',str(float(a)/float(b)))
    return str(float(a)/float(b))


def get_no_bracket_express(exp):
    exp=exp.strip('()')
    while 1:
      ret=re.search(r'\d*\.?\d*[*/]-?\d*\.?\d*',exp)
      if ret:
        old_express=ret.group()
        exp = exp.replace(old_express,mul_div(old_express))
        print('括号里计算的表达式 ',exp)
      else:
        exp=son_deal(exp)
        print('去掉+-,--后的结果',exp)
        exp=add_minus_func(exp)
        return exp

#找出括号,返回替换后的值
def search_bracket_exp(exp):
  regex = r'\([^()]+\)'
  while 1:
    ret= re.search(regex, exp)
    if ret:
      new_exp_c=ret.group()
      print(new_exp_c)
      exp = exp.replace(new_exp_c, get_no_bracket_express(new_exp_c))
      print('去掉括号的结果',exp)
    else:
      #1-2*-1388328.8880952382
      exp =get_no_bracket_express(exp)
      return exp

express='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
new_str=express.replace(' ','')
new_str=search_bracket_exp(new_str)
print(new_str)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用asyncio 封装文件读写
Sep 11 Python
Redis使用watch完成秒杀抢购功能的代码
May 07 Python
django 将model转换为字典的方法示例
Oct 16 Python
Python读取指定日期邮件的实例
Feb 01 Python
Python进阶之@property动态属性的实现
Apr 01 Python
PyQt编程之如何在屏幕中央显示窗体的实例
Jun 18 Python
python 将字符串中的数字相加求和的实现
Jul 18 Python
python 协程 gevent原理与用法分析
Nov 22 Python
Pytorch 实现权重初始化
Dec 31 Python
Python定义一个函数的方法
Jun 15 Python
python3字符串输出常见面试题总结
Dec 01 Python
python 算法题——快乐数的多种解法
May 27 Python
python输出结果刷新及进度条的实现操作
Jul 13 #Python
python实现图像外边界跟踪操作
Jul 13 #Python
Python实现打包成库供别的模块调用
Jul 13 #Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 #Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
Jul 13 #Python
Python使用pyexecjs代码案例解析
Jul 13 #Python
如何在VSCode下使用Jupyter的教程详解
Jul 13 #Python
You might like
珊瑚虫IP库浅析
2007/02/15 PHP
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
php curl批处理实现可控并发异步操作示例
2018/05/09 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
直接拿来用的15个jQuery代码片段
2015/09/23 Javascript
Angular 路由route实例代码
2016/07/12 Javascript
js实现动态显示时间效果
2017/03/06 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
2018/12/22 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
python自定义解析简单xml格式文件的方法
2015/05/11 Python
Python面向对象特殊成员
2017/04/24 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
pytorch中torch.max和Tensor.view函数用法详解
2020/01/03 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
美国女鞋品牌:naturalizer(娜然)
2016/08/01 全球购物
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
泰国演唱会订票网站:StubHub泰国
2018/02/26 全球购物
英国国家美术馆商店:National Gallery
2019/05/01 全球购物
机电一体化专业应届生求职信
2013/11/27 职场文书
初中生评语大全
2014/04/24 职场文书
「月刊Action」2022年5月号封面公开
2022/03/21 日漫
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers