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判断端口是否打开的实现代码
Feb 10 Python
python利用datetime模块计算时间差
Aug 04 Python
用python写的一个wordpress的采集程序
Feb 27 Python
深入浅析python定时杀进程
Jun 06 Python
python fabric实现远程部署
Jan 05 Python
python递归删除指定目录及其所有内容的方法
Jan 13 Python
对pandas处理json数据的方法详解
Feb 08 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
对python特殊函数 __call__()的使用详解
Jul 02 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
Jan 10 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 Python
python开发入门——set的使用
Sep 03 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
暴雪前总裁遗憾:没尽早追赶Dota 取消星际争霸幽灵
2020/03/08 星际争霸
文章推荐系统(二)
2006/10/09 PHP
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
2009/09/09 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
js 弹出框只弹一次(二次修改之后的)
2013/11/26 Javascript
js/jquery解析json和数组格式的方法详解
2014/01/09 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
2016/01/27 Javascript
jQuery插件Validation快速完成表单验证的方式
2016/07/28 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
Python paramiko模块的使用示例
2018/04/11 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
Python基于QQ邮箱实现SSL发送
2020/04/26 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
三分钟英语演讲稿
2014/04/24 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
信贷客户经理岗位职责
2015/04/09 职场文书
圆明园观后感
2015/06/03 职场文书
地震捐款简报
2015/07/21 职场文书
安全事故隐患排查治理制度
2015/08/05 职场文书