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实现登陆知乎获得个人收藏并保存为word文件
Mar 16 Python
使用Python的Flask框架来搭建第一个Web应用程序
Jun 04 Python
python如何让类支持比较运算
Mar 20 Python
Python开启线程,在函数中开线程的实例
Feb 22 Python
Python静态类型检查新工具之pyright 使用指南
Apr 26 Python
将Pytorch模型从CPU转换成GPU的实现方法
Aug 19 Python
使用虚拟环境打包python为exe 文件的方法
Aug 29 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
python selenium自动化测试框架搭建的方法步骤
Jun 14 Python
浅谈django不使用restframework自定义接口与使用的区别
Jul 15 Python
通过实例解析Python文件操作实现步骤
Sep 21 Python
pycharm实现猜数游戏
Dec 07 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运行速度的一些小技巧分享
2012/07/03 PHP
深入PHP magic quotes的详解
2013/06/17 PHP
php文件读取方法实例分析
2015/06/20 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
JavaScript 判断浏览器是否支持SVG的代码
2013/03/21 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
2013/06/19 Javascript
jQuery基础知识小结
2014/12/22 Javascript
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
React Router V4使用指南(精讲)
2018/09/17 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
node.js基础知识汇总
2020/08/25 Javascript
js中复选框的取值及赋值示例详解
2020/10/18 Javascript
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
彻底理解Python中的yield关键字
2019/04/01 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
python防止随意修改类属性的实现方法
2019/08/21 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
Python中的sys.stdout.write实现打印刷新功能
2020/02/21 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
pandas参数设置的实用小技巧
2020/08/23 Python
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
拓展培训心得体会
2014/01/04 职场文书
三年大学自我鉴定
2014/01/16 职场文书
2014年社区庆元旦活动方案
2014/03/08 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
世界遗产的导游词
2015/02/13 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书