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 collections模块实例讲解
Apr 07 Python
python通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
Python使用BeautifulSoup库解析HTML基本使用教程
Mar 31 Python
python爬取亚马逊书籍信息代码分享
Dec 09 Python
利用Python如何将数据写到CSV文件中
Jun 05 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
Apr 26 Python
python实现beta分布概率密度函数的方法
Jul 08 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 Python
python 实现多维数组转向量
Nov 30 Python
python中p-value的实现方式
Dec 16 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 Python
python drf各类组件的用法和作用
Jan 12 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
十大催泪虐心动漫,你能坚持看到第几部?
2020/03/04 日漫
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
php+MySql实现登录系统与输出浏览者信息功能
2016/07/01 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
php实现评论回复删除功能
2017/05/23 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
Display SQL Server Version Information
2007/06/21 Javascript
JS 面向对象的5钟写法
2009/07/31 Javascript
关于scrollLeft,scrollTop的浏览器兼容性测试
2013/03/19 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
js调试系列 源码定位与调试[基础篇]
2014/06/18 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
详解webpack 多页面/入口支持&公共组件单独打包
2017/06/29 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
python打开网页和暂停实例
2014/09/30 Python
Python中使用platform模块获取系统信息的用法教程
2016/07/08 Python
Python小进度条显示代码
2019/03/05 Python
python中dict使用方法详解
2019/07/17 Python
python如何从文件读取数据及解析
2019/09/19 Python
Python 实现try重新执行
2019/12/21 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
Python基于template实现字符串替换
2020/11/27 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
2013/01/09 HTML / CSS
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
工程监理应届生求职信
2013/11/09 职场文书
营销总经理的岗位职责
2013/12/15 职场文书
会计专业求职信范文
2014/03/16 职场文书
三分钟自我介绍演讲稿
2014/08/21 职场文书
夫妻双方自愿离婚协议书
2014/10/24 职场文书
2016中考冲刺决心书
2015/09/22 职场文书