import re
remove_parentheses = re.compile('\([^()]+\)') def Remove_Parentheses(obj, s): # 找到内层的括号并且返回单个括号
while obj.search(s):
ret = obj.search(s).group()
if ('*'in ret) or ('/' in ret): # 判断括号里是否有乘法 除法
ret1 = ride_div(ret)      # 有则调用 ride_div() 函数
s = s.replace(ret, ret1)    # 把乘法后的返回值进行重新赋值, 在乘法的函数里 还调用了加减法的函数, 详情看往下看.
else:
ret2 = add_sub(ret)      # 若没有 乘除法 则直接调用 加减法的函数 add_sub()
s = s.replace(ret, ret2)    #把加减法后的返回值 重新赋值.
return s def ride_div(s): # 求乘除法的值
while re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?', s): #用 search判断 若不是None则继续进行
minus(s)                          # 此函数是为了把 -- -+ +- ++ 替换成 单个的
ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?', s).group()
a, d ,b = re.split('([/*])', ret)
if d == '*':
sum = float(a) * float(b)
s = s.replace(ret, str(sum))      # 把得到的积 重新赋值
elif d == '/':
sum = float(a) / float(b)
s = s.replace(ret, str(sum)) # 把得到的商 重新赋值
else:
ret_new = add_sub(s) # 此处是为了当while 条件为None时 调用加减法, 把值相加或相减
return ret_new.strip('(').strip(')') # 最后得到一个数字 进行返回 def add_sub(s): # 求加减的值
while re.search('-?\d+(\.\d+)?[+-]-?\d+(\.\d+)?', s):
s = minus(s)
ret = re.search('(?P<a>-?\d+(\.\d+)?)(?P<d>[+-])(?P<b>-?\d+(\.\d+)?)', s) # 此处,因为用切割的话 会有bug, 所以选择了用 分组的命名
a = ret.group('a')
d = ret.group('d')
b = ret.group('b')
if d == '+':
sum = float(a) + float(b)
elif d == '-':
sum = float(a) - float(b)
s = s.replace(ret.group(0), str(sum))
s = s.strip('(').strip(')')
return s def minus(s): #更改 不和谐的 符号
while ('--' in s) or ('-+' in s) or ('+-' in s) or ('++' in s) :
s = s.replace('--','+')
s = s.replace('-+','-')
s = s.replace('+-','-')
s = s.replace('++','+')
return s def main(): # 主函数
while 1:
s = input('请输入你要计算的式子,输入回车退出程序:').strip().replace(' ', '')
if not s:
break
if "(" in s:
ret1 = Remove_Parentheses(remove_parentheses, s)
ret2 = ride_div(ret1)
ret3 = add_sub(ret2)
print(ret3)
else:
ret2 = ride_div(s)
ret3 = add_sub(ret2)
print(ret3) main()

计算器-- 利用re模块 利用函数封装 第二版的更多相关文章

  1. 瞎j8封装第二版之数据层的封装

    看了以前写的代码,对就是下面这个 手把手封装数据层之DataUtil数据库操作的封装 觉得以前写的代码好烂啊!!!,重新理了一下思路,写得更规范和简练,应该效率也会高很多,用了一下下午写的连接池(半废 ...

  2. 在SQL SERVER中实现RSA加解密函数(第二版)

    /*************************************************** 作者:herowang(让你望见影子的墙) 日期:2010.1.5 注: 转载请保留此信息 更 ...

  3. 瞎j8封装第二版之用xml文件来代理dao接口

    也是重新整理了之前的那篇 模仿Mybatis用map per.xml实现Dao层接口的功能 话不多说直接上代码 首先是结构 依赖pom.xml <?xml version="1.0&q ...

  4. 瞎j8封装第二版之数据库连接池

    写得很蛋疼,本来想支持多线程的,奈何对多线程和连接池理解着实太菜: 所以,起码是能拿到连接了... 但是还是不太懂这个连接池 我也是半抄别人的,以后再搞一搞这个吧. 先是配置文件 理想是很丰满的,奈何 ...

  5. 利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版)

    利用MYSQL的函数实现用户登录功能,进出都是JSON(第二版) CREATE DEFINER=`root`@`%` FUNCTION `uc_session_login`( `reqjson` JS ...

  6. nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证

    http模块内部封装了http服务器和客户端,因此Node.js不需要借助Apache.IIS.Nginx.Tomcat等传统HTTP服务器,就可以构建http服务器,亦可以用来做一些爬虫.下面简单介 ...

  7. python:利用pymssql模块操作SQL server数据库

    python默认的数据库是 SQLlite,不过它对MySql以及SQL server的支持也可以.这篇博客,介绍下如何在Windows下安装pymssql库并进行连接使用... 环境:Windows ...

  8. python:利用configparser模块读写配置文件

    在自动化测试过程中,为了提高脚本的可读性和降低维护成本,将一些通用信息写入配置文件,将重复使用的方法写成公共模块进行封装,使用时候直接调用即可. 这篇博客,介绍下python中利用configpars ...

  9. 利用Jquery的load函数实现页面的动态加载

    利用Jquery的load函数实现页面的动态加载  js的强大功能相信大家都知晓,今天通过jquery的库函数load可以更加方便的实现页面的动态刷新,经过几天的研究与探索,终于有所成效!吾心甚蔚! ...

随机推荐

  1. vSphere VCSA5.5加入AD域环境问题记录

    vSphere VCSA5.5加入AD域环境问题记录 实验目的: 搭建一套vSphere VCSA5.5,并加入新搭建的AD域,并使用一个域用户登录VC,赋予对VC的只读权限. 实验环境: 使用VMW ...

  2. webStrom的破解以及汉化

    破解方法: 把JetbrainsCrack-3.1-release-enc.jar包放到bin目录下,然后把webstorm64.exe.vmoptions文件用文本打开, 在最后面加上一句-java ...

  3. WHU 1548 Home 2-SAT

    ---恢复内容开始--- 题意: N个人想回家在至少一个时刻.至多两个时刻.并且,他们每个人都能独自回家. 定义:ai表示第i个人回家的时间, xij = abs(ai - aj) (i != j). ...

  4. Unity经验之谈

    1.全屏与非全屏之间的切换 if (Input.GetMouseButtonDown(1)) { Screen.fullScreen = !Screen.fullScreen; } 2.Camera适 ...

  5. HDU 3277 Marriage Match III

    Marriage Match III Time Limit: 4000ms Memory Limit: 32768KB This problem will be judged on HDU. Orig ...

  6. C#版清晰易懂TCP通信原理解析(附demo)

    [转] C#版清晰易懂TCP通信原理解析(附demo) (点击上方蓝字,可快速关注我们) 来源:周见智 cnblogs.com/xiaozhi_5638/p/4244797.html 对.NET中网络 ...

  7. Liquibase+spring 初步使用

    现在的工作的项目中用了liquibase,感觉挺爽的,可以跟踪.管理数据库的重构.这对于很多需求变更较大的项目是非常不错的,特别是互联网的项目.(虽然互联网Nosql已经非常流行,不过俺觉得传统关系型 ...

  8. 【计算机视觉】基于Kalman滤波器的进行物体的跟踪

    预估器 我们希望能够最大限度地使用測量结果来预计移动物体的运动. 所以,多个測量的累积能够让我们检測出不受噪声影响的部分观測轨迹. 一个关键的附加要素即此移动物体运动的模型. 有了这个模型,我们不仅能 ...

  9. 绿色便携版Lazarus的制作教程

    本文来源: www.fpccn.com 原作者:逍遥派掌门人 http://msdn.microsoft.com/zh-cn/library/windows/apps/hh452791.aspx 本教 ...

  10. Eight hdu 1043 poj 1077

    Description The 15-puzzle has been around for over 100 years; even if you don't know it by that name ...