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 getopt模块处理命令行选项实例
May 13 Python
Python中zip()函数用法实例教程
Jul 31 Python
详尽讲述用Python的Django框架测试驱动开发的教程
Apr 22 Python
Python的Django框架中if标签的相关使用
Jul 15 Python
Python ftp上传文件
Feb 13 Python
浅析python中SQLAlchemy排序的一个坑
Feb 24 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
Oct 26 Python
Python实现的KMeans聚类算法实例分析
Dec 29 Python
python 调用有道api接口的方法
Jan 03 Python
Pytorch上下采样函数--interpolate用法
Jul 07 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 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实现的功能是显示8条基色色带
2006/10/09 PHP
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
php上传中文文件名乱码问题处理方案
2015/02/03 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
JS实现div内部的文字或图片自动循环滚动代码
2013/04/19 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
2015/10/29 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
JavaScript使用ZeroClipboard操作剪切板
2017/05/10 Javascript
Vue学习笔记之表单输入控件绑定
2017/09/05 Javascript
JQuery实现table中tr上移下移的示例(超简单)
2018/01/08 jQuery
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
python爬虫使用cookie登录详解
2017/12/27 Python
浅谈pyqt5中信号与槽的认识
2019/02/17 Python
python实现拼接图片
2020/03/23 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
Farnell德国:电子元器件供应商
2018/07/10 全球购物
在校生党员自我评价
2013/09/25 职场文书
个人找工作求职简历的自我评价
2013/10/20 职场文书
百日安全活动总结
2014/05/04 职场文书
教师读书活动总结
2014/05/07 职场文书
感恩祖国演讲稿
2014/09/09 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
医者仁心观后感
2015/06/17 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技