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使用在线API查询IP对应的地理位置信息实例
Jun 01 Python
python使用sorted函数对列表进行排序的方法
Apr 04 Python
简单了解python 邮件模块的使用方法
Jul 24 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
python sorted函数的小练习及解答
Sep 18 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
Oct 18 Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 Python
使用Python获取当前工作目录和执行命令的位置
Mar 09 Python
基于matplotlib中ion()和ioff()的使用详解
Jun 16 Python
浅谈Python中对象是如何被调用的
Apr 06 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
第一节--面向对象编程
2006/11/16 PHP
PHP 超链接 抓取实现代码
2009/06/29 PHP
浅析php学习的路线图
2013/07/10 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
jquery文字上下滚动的实现方法
2013/03/22 Javascript
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
JavaScript中split() 使用方法汇总
2015/04/17 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
webpack配置之后端渲染详解
2017/10/26 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
浅谈实现在线预览PDF的几种解决办法
2020/08/10 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
token 机制和实现方式
2020/12/15 Javascript
python类定义的讲解
2013/11/01 Python
python中scikit-learn机器代码实例
2018/08/05 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
活动总结格式范文
2014/04/26 职场文书
中学生演讲稿
2014/04/26 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
OpenCV-Python实现图像平滑处理操作
2021/06/08 Python
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL
Win11更新失败并提示0xc1900101
2022/04/19 数码科技