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中input和raw_input的一点区别
Oct 21 Python
Python远程桌面协议RDPY安装使用介绍
Apr 15 Python
浅析Python中的多条件排序实现
Jun 07 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
Dec 26 Python
python实现弹跳小球
May 13 Python
Django框架实现的分页demo示例
May 25 Python
用Python+OpenCV对比图像质量的几种方法
Jul 15 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
python 双循环遍历list 变量判断代码
May 04 Python
如何基于Python和Flask编写Prometheus监控
Nov 25 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
PHP高级OOP技术演示
2009/08/27 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
2015/03/17 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
js实现n秒倒计时后才可以点击的效果
2015/12/20 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
详解angular用$sce服务来过滤HTML标签
2017/04/11 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
python+mongodb数据抓取详细介绍
2017/10/25 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
python操作oracle的完整教程分享
2018/01/30 Python
python实现汉诺塔算法
2021/03/01 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
挪威手表购物网站:Klokker
2016/09/19 全球购物
台湾东南旅游社网站:东南旅游
2019/02/11 全球购物
求职简历自荐信
2013/10/20 职场文书
人事专员的职责
2014/02/26 职场文书
高中学生会竞选演讲稿
2014/08/25 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
Python使用openpyxl模块处理Excel文件
2022/06/05 Python