python 利用正则构建一个计算器
该计算器主要分为四个模块:
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 利用正则构建一个计算器相关推荐
- Python使用tkinter构建一个多元回归预测模型GUI界面(接受用户输入数据并给出模型推理结果)
Python使用tkinter构建一个多元回归预测模型GUI界面(接受用户输入数据并给出模型推理结果) 目录
- python从random生成列表_详解Python利用random生成一个列表内的随机数
详解Python利用random生成一个列表内的随机数 首先,需要导入random模块: import random 随机取1-33之间的1个随机数,可能重复: random.choice(range ...
- Python利用PyQt5制作一个获取网络实时数据NBA数据播报GUI
现在NBA联赛也进行到半决赛了,我们怎么样才能以更快的方法获取NBA的数据呢?这里我们就自己来做一个数据播报的程序 文章目录 制作NBA数据爬虫 捋顺思路 编写代码 NBAReporter.py NB ...
- myos1 大学生利用C++构建一个完整的操作系统打印helloworld
myos1 大学生利用C++构建一个完整的操作系统打印helloworld myos2 大学生利用C++构建一个完整的操作系统之响应键盘中断 myos3 大学生利用C++构建一个完整的操作系统之代码重 ...
- 【c语言写计算器】利用函数写一个计算器 包括菜单功能和加减乘除四个功能
/*利用函数写一个计算器 包括菜单功能和加减乘除四个功能 作者:NBDR_YL*/ #include<stdio.h>int mean(void); //声明菜单的函数 float add ...
- 利用正则做一个会员注册管理系统
今天学习了利用正则来做一个会员注册管理系统,该系统的主要难点在于: 1.利用正则来判断账号以及密码是否合法 2.字典的增删查改 3.while循环,break,嵌套if判断语句 正则我是在 [正则网页 ...
- 使用Python+Flask+OpenCV构建一个相机应用程序
前言 在这篇博文中,我们将使用 Flask 框架构建一个相机应用程序,我们可以在其中单击图片.录制视频.应用诸如灰度.负片和"仅人脸"之类的滤镜,就像出现在 Snapchat 上的 ...
- Python 利用PyQt5写一个简易的串口助手
学习单片机,STM32好长时间了,也做了一些项目,一直想利用上位机实现电脑与单片机之间的传输数据,利用串口助手是最直接的通信方式,但串口助手不适合做上位机,如果会写串口助手的软件,基本能写自己写一个上 ...
- python利用proxybroker构建爬虫免费IP代理池!不用担心被封了!
大纲 前言 ProxyBroker简介 ProxyBroker安装 在终端使用ProxyBroker 在代码中使用ProxyBroker 总结 前言 写爬虫的小伙伴可能遇到过这种情况: 正当悠闲地喝着 ...
最新文章
- Mathematica开始学习,
- torch 判断gpu可用
- 关键词优化一定要从正规渠道入手
- postman 并发测试
- 魅蓝android底层是什么,集体去YunOS化:魅蓝2\魅蓝Metal更换安卓底层
- 刹车八个技巧 教你踩得又稳又好
- PhotoSwipe源码解读系列(二)
- centos 6.7 安装php7
- tensorflow 数据归一化_TensorFlow——批量归一化操作
- python生成器yield原理_python生成器generator,yield
- 基于阿里云Aliddns动态域名解析的客户端PHP实现与服务器端(包含C与PHP)实现
- ping命令显示时间
- 科研绘图自由之开放式绘图平台 (Figdraw)
- 据说Kivy可以将Python程序弄成App来玩,所以 安装Kivy。关于安装Kivy失败后的解决方案过程
- 互联网常见通用的运营数据指标
- 词根vol/volve/vor/vid/vis/等衍生出单词
- 网络安全传输系统(3)-加密传输
- k8s DNS服务配置
- 小程序云开发db封装
- 计算机专业拜年语,南昌理工学院计算机信息工程学院给您拜年啦!!
热门文章
- 简单易用NLP框架Flair发布新版本!(附教程)
- 微信小程序开发系列一:微信小程序的申请和开发环境的搭建
- (十六) 整合spring cloud云架构 -使用spring cloud Bus刷新配置
- Android 6.0 变更
- 2、EVE-NG镜像导入(Dynamipshe和IOL)
- linux后台运行和关闭、查看后台任务
- 建议转变编程时的思维习惯改为:忽略细节关扰,直指问题核心,追寻问题关键。...
- Tungsten Fabric SDN — 与 OpenStack 的集成部署
- ETSI — MEC — 移动性支持
- 5GS 协议栈 — PFCP 协议 — BAR 缓存行为规则