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操作sqlite3快速、安全插入数据(防注入)的实例
Apr 26 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
Jun 18 Python
python3中dict(字典)的使用方法示例
Mar 22 Python
用python与文件进行交互的方法
Mar 01 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
Feb 26 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
对Python的交互模式和直接运行.py文件的区别详解
Jun 29 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
python 实现方阵的对角线遍历示例
Nov 29 Python
python读取与处理netcdf数据方式
Feb 14 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
Apr 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
phpQuery占用内存过多的处理方法
2013/11/13 PHP
php实现读取超大文件的方法
2014/07/28 PHP
Linux下安装PHP MSSQL扩展教程
2014/10/24 PHP
extjs DataReader、JsonReader、XmlReader的构造方法
2009/11/07 Javascript
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
子窗体与父窗体传值示例js代码
2013/08/01 Javascript
详解JavaScript函数绑定
2013/08/18 Javascript
JavaScript中定义对象原型的两种使用方法
2016/12/15 Javascript
javascript实现右下角广告框效果
2017/02/01 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
2017/10/13 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
2019/07/10 jQuery
javascript随机变色实例代码
2019/10/15 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
python使用socket连接远程服务器的方法
2015/04/29 Python
python实现类的静态变量用法实例
2015/05/08 Python
Python代码块批量添加Tab缩进的方法
2018/06/25 Python
numpy中的ndarray方法和属性详解
2019/05/27 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
举例讲解Python装饰器
2020/12/24 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
高档奢华时装在线目的地:FORWARD by elyse walker
2017/10/16 全球购物
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
签约仪式主持词
2014/03/19 职场文书
卫校毕业生个人自我鉴定
2014/04/28 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书
详解nodejs内置模块
2021/05/06 NodeJs
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP
MySql开发之自动同步表结构
2021/05/28 MySQL
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python