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运行的17个时新手常见错误小结
Aug 07 Python
python去除扩展名的实例讲解
Apr 23 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
python顺序执行多个py文件的方法
Jun 29 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
面向对象学习之pygame坦克大战
Sep 11 Python
django 简单实现登录验证给你
Nov 06 Python
python:动态路由的Flask程序代码
Nov 22 Python
python redis存入字典序列化存储教程
Jul 16 Python
无需压缩软件,用python帮你操作压缩包
Aug 17 Python
如何用Python搭建gRPC服务
Jun 30 Python
Python tensorflow卷积神经Inception V3网络结构
May 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
php中mysql连接方式PDO使用详解
2015/02/25 PHP
PHP中list()函数用法实例简析
2016/01/08 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
javascript去除空格方法小结
2015/05/21 Javascript
JavaScript创建对象的方式小结(4种方式)
2015/12/17 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
详解Nodejs mongoose
2018/06/10 NodeJs
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
vue中使用vue-print.js实现多页打印
2020/03/05 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
python如何使用unittest测试接口
2018/04/04 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
金山毒霸系列的笔试题
2013/04/13 面试题
大专毕业生自我鉴定
2013/11/21 职场文书
社区工作者感言
2014/03/02 职场文书
健康家庭事迹材料
2014/05/02 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
2014年体育工作总结
2014/11/24 职场文书
市场营销计划书
2015/01/17 职场文书
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL