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递归函数定义与用法示例
Jun 02 Python
详解supervisor使用教程
Nov 21 Python
zookeeper python接口实例详解
Jan 18 Python
Pycharm 操作Django Model的简单运用方法
May 23 Python
python版飞机大战代码分享
Nov 20 Python
python使用KNN算法识别手写数字
Apr 25 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
python 实现快速生成连续、随机字母列表
Nov 28 Python
Python字符串格式化常用手段及注意事项
Jun 17 Python
python 写一个水果忍者游戏
Jan 13 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 Python
浅谈Python xlwings 读取Excel文件的正确姿势
Feb 26 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
对Session和Cookie的区分与解释
2007/03/16 PHP
php 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
Javascript 作用域使用说明
2009/08/13 Javascript
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
详解基于Wepy开发小程序插件(推荐)
2019/08/01 Javascript
vue和iview实现Scroll 数据无限滚动功能
2019/10/31 Javascript
Vue.extend 登录注册模态框的实现
2020/12/29 Vue.js
JavaScript的一些小技巧分享
2021/01/06 Javascript
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
Python3.x对JSON的一些操作示例
2017/09/01 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
python,Django实现的淘宝客登录功能示例
2019/06/12 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
你所在的项目是如何确定版本号的
2015/12/28 面试题
四种会话跟踪技术
2015/05/20 面试题
新年爱情寄语
2014/04/08 职场文书
求职信标题怎么写
2014/05/26 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
承兑汇票转让证明怎么写?
2014/11/30 职场文书
外国人来华邀请函
2015/01/31 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS