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后台管理程序
Apr 13 Python
python实现简易通讯录修改版
Mar 13 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
使用Python画股票的K线图的方法步骤
Jun 28 Python
python mysql断开重连的实现方法
Jul 26 Python
python按行读取文件并找出其中指定字符串
Aug 08 Python
python global关键字的用法详解
Sep 05 Python
浅谈python的elementtree模块处理中文注意事项
Mar 06 Python
手把手教你使用TensorFlow2实现RNN
Jul 15 Python
Python+Selenium实现读取网易邮箱验证码
Mar 13 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 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
隐性调用php程序的方法
2009/03/09 PHP
PHP 防注入函数(格式化数据)
2011/08/08 PHP
WordPress网站性能优化指南
2015/11/18 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
Prototype使用指南之selector.js说明
2008/10/26 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
2014/07/02 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
js实现常用排序算法
2016/08/09 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
用AngularJS来实现监察表单按钮的禁用效果
2016/11/02 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
JS中DOM元素的attribute与property属性示例详解
2018/09/04 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
BootstrapValidator实现表单验证功能
2019/11/08 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
python网络爬虫采集联想词示例
2014/02/11 Python
Python中处理字符串的相关的len()方法的使用简介
2015/05/19 Python
Python实现身份证号码解析
2015/09/01 Python
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
python3中数组逆序输出方法
2020/12/01 Python
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
用友笔试题目
2016/10/25 面试题
大学共青团员个人自我评价
2014/04/16 职场文书
本科应届生求职信
2014/08/05 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
作息时间调整通知
2015/04/22 职场文书
大学生各类奖学金申请书
2019/06/24 职场文书
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python