该计算器主要分为四个模块:

weclome_func函数用来进入界面获取表达式,并判断表达式是否正确,然后返回表达式;

add_sub函数用来进行加减运算,如果有多个加减运算,会递归,最后返回对应的值

multi_divide函数用来进行乘除运算,如果有多个乘除运算,会递归,最后返回对应的值

del_bracket函数用来去除小括号及调用multi_divide和add_sub函数,如果存在多个括号,也会实现递归。

代码如下:

#! /usr/bin/env python3import sys
import redef welcome_func():flag_exit = Truewelcome_str = "超级计算器"print(welcome_str.center(50, "*"), '\n')while flag_exit:exp = input("请输入要计算的表达式[q:退出]: ").strip()if exp == "q":flag_exit = Falseelif len(exp) == 0:continueelse:exp = re.sub("\s*", '', exp)     ## 取出空格return expdef multi_divide(expression):val = re.search("\d+\.?\d*[*/][+-]?\d+\.?\d*", expression)    ##匹配乘除号,如192.168*-1.99if not val:    # 乘除号不存在,返回输入的表达式return expressiondata = re.search("\d+\.?\d*[*/][+-]?\d+\.?\d*", expression).group()if len(data.split('*')) > 1:           # 当可以用乘号分割,证明有乘法运算part1, part2 = data.split('*')     # 用除号分割value = float(part1) * float(part2)else:part1, part2 = data.split('/')if float(part2) == 0:            # 如果分母为0,则退出计算sys.exit("计算过程中有被除数为0的存在,计算表达式失败!")value = float(part1) / float(part2)s1, s2 = re.split("\d+\.?\d*[*/][+-]?\d+\.?\d*", expression, 1)  # 分割表达式next_expression = "%s%s%s" % (s1, value, s2)return multi_divide(next_expression)      # 递归表达式def add_sub(expression):expression = expression.replace('+-', '-')      # 替换表达式里的所有‘+-‘expression = expression.replace('--', '+')      # 替换表达式里的所有‘--‘expression = expression.replace('-+', '-')      # 替换表达式里的所有‘-+‘expression = expression.replace('++', '+')      # 替换表达式里的所有‘++‘
data = re.search('\d+\.?\d*[+-]\d+\.?\d*', expression)    # 匹配加减号if not data:                    # 如果不存在加减号,则证明表达式已计算完成,返回最终结果return expressionval = re.search('[+-]?\d+\.?\d*[+-]\d+\.?\d*', expression).group()if len(val.split('+')) > 1:                   # 以加号分割成功,有加法计算part1, part2 = val.split('+')value = float(part1) + float(part2)elif val.startswith('-'):                     # 如果是已‘-‘开头则需要单独计算part1, part2, part3 = val.split('-')value = -float(part2) - float(part3)      # 计算以负数开头的减法else:part1, part2 = val.split('-')value = float(part1) - float(part2)s1, s2 = re.split('[+-]?\d+\.?\d*[+-]\d+\.?\d*', expression, 1)    # 分割表达式next_expression = "%s%s%s" % (s1, value, s2)return add_sub(next_expression)              # 递归运算表达式def del_bracket(expression):## [^()]+  匹配除了括号以外的任意字符if not re.search(r"\([^()]+\)", expression):   # 判断小括号,如果不存在小括号,直接调用乘除,加减计算ret1 = multi_divide(expression)ret2 = add_sub(ret1)return ret2                      # 返回最终计算结果data = re.search(r"\([^()]+\)", expression).group()    # 如果有小括号,匹配出优先级最高的小括号print("获取表达式", data)data = data.strip('[\(\)]')           # 剔除小括号ret1 = multi_divide(data)# print("全部乘除计算完后的表达式:", ret1)ret2 = add_sub(ret1)# print("全部加减计算结果:", ret2)part1, part2 = re.split(r"\([^()]+\)", expression, 1)         # 分割表达式expression = "%s%s%s" % (part1, ret2, part2)return del_bracket(expression)                         # 递归去小括号if __name__ == "__main__":try:expression = welcome_func()     ## 获取表达式print(expression)result = eval(expression)       ## 用eval来验证print(result)ret = del_bracket(expression)   ## 用函数计算得出结果result = float(result)ret = float(ret)print("eval计算结果: ", result)print("表达式计算结果: ", ret)except (SyntaxError, ValueError, TypeError):print("输入表达式不合法,请检查!")

转载于:https://www.cnblogs.com/654wangzai321/p/8166355.html

python 利用正则构建一个计算器相关推荐

  1. Python使用tkinter构建一个多元回归预测模型GUI界面(接受用户输入数据并给出模型推理结果)

    Python使用tkinter构建一个多元回归预测模型GUI界面(接受用户输入数据并给出模型推理结果) 目录

  2. python从random生成列表_详解Python利用random生成一个列表内的随机数

    详解Python利用random生成一个列表内的随机数 首先,需要导入random模块: import random 随机取1-33之间的1个随机数,可能重复: random.choice(range ...

  3. Python利用PyQt5制作一个获取网络实时数据NBA数据播报GUI

    现在NBA联赛也进行到半决赛了,我们怎么样才能以更快的方法获取NBA的数据呢?这里我们就自己来做一个数据播报的程序 文章目录 制作NBA数据爬虫 捋顺思路 编写代码 NBAReporter.py NB ...

  4. myos1 大学生利用C++构建一个完整的操作系统打印helloworld

    myos1 大学生利用C++构建一个完整的操作系统打印helloworld myos2 大学生利用C++构建一个完整的操作系统之响应键盘中断 myos3 大学生利用C++构建一个完整的操作系统之代码重 ...

  5. 【c语言写计算器】利用函数写一个计算器 包括菜单功能和加减乘除四个功能

    /*利用函数写一个计算器 包括菜单功能和加减乘除四个功能 作者:NBDR_YL*/ #include<stdio.h>int mean(void); //声明菜单的函数 float add ...

  6. 利用正则做一个会员注册管理系统

    今天学习了利用正则来做一个会员注册管理系统,该系统的主要难点在于: 1.利用正则来判断账号以及密码是否合法 2.字典的增删查改 3.while循环,break,嵌套if判断语句 正则我是在 [正则网页 ...

  7. 使用Python+Flask+OpenCV构建一个相机应用程序

    前言 在这篇博文中,我们将使用 Flask 框架构建一个相机应用程序,我们可以在其中单击图片.录制视频.应用诸如灰度.负片和"仅人脸"之类的滤镜,就像出现在 Snapchat 上的 ...

  8. Python 利用PyQt5写一个简易的串口助手

    学习单片机,STM32好长时间了,也做了一些项目,一直想利用上位机实现电脑与单片机之间的传输数据,利用串口助手是最直接的通信方式,但串口助手不适合做上位机,如果会写串口助手的软件,基本能写自己写一个上 ...

  9. python利用proxybroker构建爬虫免费IP代理池!不用担心被封了!

    大纲 前言 ProxyBroker简介 ProxyBroker安装 在终端使用ProxyBroker 在代码中使用ProxyBroker 总结 前言 写爬虫的小伙伴可能遇到过这种情况: 正当悠闲地喝着 ...

最新文章

  1. Mathematica开始学习,
  2. torch 判断gpu可用
  3. 关键词优化一定要从正规渠道入手
  4. postman 并发测试
  5. 魅蓝android底层是什么,集体去YunOS化:魅蓝2\魅蓝Metal更换安卓底层
  6. 刹车八个技巧 教你踩得又稳又好
  7. PhotoSwipe源码解读系列(二)
  8. centos 6.7 安装php7
  9. tensorflow 数据归一化_TensorFlow——批量归一化操作
  10. python生成器yield原理_python生成器generator,yield
  11. 基于阿里云Aliddns动态域名解析的客户端PHP实现与服务器端(包含C与PHP)实现
  12. ping命令显示时间
  13. 科研绘图自由之开放式绘图平台 (Figdraw)
  14. 据说Kivy可以将Python程序弄成App来玩,所以 安装Kivy。关于安装Kivy失败后的解决方案过程
  15. 互联网常见通用的运营数据指标
  16. 词根vol/volve/vor/vid/vis/等衍生出单词
  17. 网络安全传输系统(3)-加密传输
  18. k8s DNS服务配置
  19. 小程序云开发db封装
  20. 计算机专业拜年语,南昌理工学院计算机信息工程学院给您拜年啦!!

热门文章

  1. 简单易用NLP框架Flair发布新版本!(附教程)
  2. 微信小程序开发系列一:微信小程序的申请和开发环境的搭建
  3. (十六) 整合spring cloud云架构 -使用spring cloud Bus刷新配置
  4. Android 6.0 变更
  5. 2、EVE-NG镜像导入(Dynamipshe和IOL)
  6. linux后台运行和关闭、查看后台任务
  7. 建议转变编程时的思维习惯改为:忽略细节关扰,直指问题核心,追寻问题关键。...
  8. Tungsten Fabric SDN — 与 OpenStack 的集成部署
  9. ETSI — MEC — 移动性支持
  10. 5GS 协议栈 — PFCP 协议 — BAR 缓存行为规则