需求:

用户输入运算表达式,终端显示计算结果

源代码:

 # !/usr/bin/env/ python3
# -*- coding: utf-8 -*- """用户输入计算表达式,显示计算结果""" __author__ = 'Jack' import re bracket = re.compile(r'\([^()]+\)') # 寻找最内层括号规则
mul = re.compile(r'(\d+\.?\d*\*-\d+\.?\d*)|(\d+\.?\d*\*\d+\.?\d*)') # 寻找乘法运算规则
div = re.compile(r'(\d+\.?\d*/-\d+\.?\d*)|(\d+\.?\d*/\d+\.?\d*)') # 寻找除法运算规则
add = re.compile(r'(-?\d+\.?\d*\+-\d+\.?\d*)|(-?\d+\.?\d*\+\d+\.?\d*)') # 寻找加法运算规则
sub = re.compile(r'(-?\d+\.?\d*--\d+\.?\d*)|(-?\d+\.?\d*-\d+\.?\d*)') # 寻找减法运算规则
c_f = re.compile(r'\(?\+?-?\d+\)?') # 检查括号内是否运算完毕规则
strip = re.compile(r'[^(].*[^)]') # 脱括号规则 def Mul(s):
"""计算表达式中的乘法运算"""
exp = re.split(r'\*', mul.search(s).group())
return s.replace(mul.search(s).group(), str(float(exp[0]) * float(exp[1]))) def Div(s):
"""计算表达式中的除法运算"""
exp = re.split(r'/', div.search(s).group())
return s.replace(div.search(s).group(), str(float(exp[0]) / float(exp[1]))) def Add(s):
"""计算表达式中的加法运算"""
exp = re.split(r'\+', add.search(s).group())
return s.replace(add.search(s).group(), str(float(exp[0]) + float(exp[1]))) def Sub(s):
"""计算表达式中的减法运算"""
exp = sub.search(s).group()
if exp.startswith('-'): #如果表达式形如:-2.2-1.2;需变换为:-(2.2+1.2)
exp = exp.replace('-', '+') #将-号替换为+号;+2.2+1.2
res = Add(exp).replace('+', '-') #调用Add运算,将返回值+3.4变为-3.4
else:
exp = re.split(r'-', exp)
res = str(float(exp[0]) - float(exp[1]))
return s.replace(sub.search(s).group(), res) def calc():
while True:
s = input('Please input the expression(q for quit):') # 例:'1+2- (3* 4-3/2+ ( 3-2*(3+ 5 -3* -0.2-3.3*2.2 -8.5/ 2.4 )+10) +10)'
if s == 'q':
break
else:
s = ''.join([x for x in re.split('\s+', s)]) # 将表达式按空格分割并重组
if not s.startswith('('): # 若用户输入的表达式首尾无括号,则统一格式化为:(表达式)
s = str('(%s)' % s)
while bracket.search(s): # 若表达式s存在括号
s = s.replace('--', '+') # 检查表达式,并将--运算替换为+运算
s_search = bracket.search(s).group() # 将最内层括号及其内容赋给变量s_search
if div.search(s_search): # 若除法运算存在(必须放在乘法之前)
s = s.replace(s_search, Div(s_search)) # 执行除法运算并将结果替换原表达式
elif mul.search(s_search): # 若乘法运算存在
s = s.replace(s_search, Mul(s_search)) # 执行乘法运算并将结果替换原表达式
elif sub.search(s_search): # 若减法运算存在(必须放在加法之前)
s = s.replace(s_search, Sub(s_search)) # 执行减法运算并将结果替换原表达式
elif add.search(s_search): # 若加法运算存在
s = s.replace(s_search, Add(s_search)) # 执行加法运算并将结果替换原表达式
elif c_f.search(s_search): # 若括号内无任何运算(类似(-2.32)除外)
s = s.replace(s_search, strip.search(s_search).group()) # 将括号脱掉,例:(-2.32)---> -2.32 print('The answer is: %.2f' % (float(s))) if __name__ == '__main__':
calc()

使用正则表达式实现计算器功能

运行效果:

最新文章

  1. Oracle安装介质及补丁集下载地址
  2. 第二十四篇:导出SOUI对象到LUA脚本
  3. asp.net中使用ueditor
  4. Java TCP Swing聊天程序
  5. 初识io流条件状态
  6. applicationContext.xml存放的位置
  7. LightOJ 1214 Large Division 水题
  8. 打开U盘里是U盘的快捷方式?(2013.12.05)
  9. IE6、火狐不支持a:visited
  10. OC中Foundation框架之NSDictionary、NSMutableDictionary
  11. C#总结(六)EventBus事件总线的使用-自己实现事件总线
  12. 高性能nosql ledisdb设计与实现 (2):replication
  13. Win 10 Revit 2019 安装过程,亲自踩的一遍坑,有你想要的细节
  14. 寒冬之下,移动开发没人要了? 浅谈 iOS 开发者该 何去何从?
  15. selenium之生成html测试报告--testng.xsl
  16. flex布局简介
  17. 【Devops】【docker】【CI/CD】2.docker启动jenkins环境+安装必要的插件
  18. apache的mod_proxy 反向代理
  19. Prometheus+Grafana+Altermanager搭建监控系统
  20. java 发架包

热门文章

  1. SAP生产订单各种日期的计算说明
  2. 进阶篇:2.2)DFMA运用实例
  3. selectComponent是ok的,小程序组件 component方式,让子页面重绘
  4. .net core 的优点
  5. golang笔记
  6. java中+=与+的区别
  7. spring data jpa 动态查询(工具类封装)
  8. Jmeter测试计划中的元素
  9. 【随笔】使用apt-spy来更新你的debian源
  10. 如何在不接入微信API的情况下自定义分享内容(图片、链接、标题)