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基础教程之序列详解
Aug 29 Python
在RedHat系Linux上部署Python的Celery框架的教程
Apr 07 Python
在Python的web框架中配置app的教程
Apr 30 Python
python学习之面向对象【入门初级篇】
Jan 21 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
Python内建模块struct实例详解
Feb 02 Python
Python使用Pickle库实现读写序列操作示例
Jun 15 Python
Python从Excel中读取日期一列的方法
Nov 28 Python
在Pytorch中计算自己模型的FLOPs方式
Dec 30 Python
Python属性和内建属性实例解析
Jan 14 Python
python计算Content-MD5并获取文件的Content-MD5值方式
Apr 03 Python
python 下载文件的几种方法汇总
Jan 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
杏林同学录(五)
2006/10/09 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
event.srcElement+表格应用
2006/08/29 Javascript
js模拟类继承小例子
2010/07/17 Javascript
模仿百度三维地图的js数据分享
2011/05/12 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
ReactNative页面跳转Navigator实现的示例代码
2017/08/02 Javascript
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
分析python动态规划的递归、非递归实现
2018/03/04 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
Python操作Jira库常用方法解析
2020/04/10 Python
如何理解python面向对象编程
2020/06/01 Python
Python eval函数原理及用法解析
2020/11/14 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
大学应届生求职简历的自我评价
2013/10/08 职场文书
社区七一党员活动方案
2014/01/25 职场文书
家长学校工作方案
2014/05/07 职场文书
感恩节活动策划方案
2014/05/16 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
2014年派出所工作总结
2014/11/21 职场文书
职位证明模板
2015/06/23 职场文书
宣传稿格式范文
2015/07/23 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python