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. prezi,mfc,toefl,java

    1 用prezi做ppt然后讲 2 用mfc把算法封起来 3 做tpo,背单词 4 写java 哪个任务都很难办.而且脚还没好.

  2. 使用google API之前需要對input 做什麼 安全性的處理?

    我正要使用node.js 和 google map api做一个小应用,Google MAP API的使用URL如下: https://maps.googleapis.com/maps/api/pla ...

  3. YYDispatchQueuePool阅读笔记

    阅读了开源大神的YYDispatchQueuePool,在此记下一些从中学到的东西. 首先YYDispatchQueuePool.m文件中有如下类型对应: static inline dispatch ...

  4. c#做对比软件

    一些 HTML内容比较/文本差异比较 开源代码 1. DiffPlex - a .NET Diff Generator    http://diffplex.codeplex.com/SourceCo ...

  5. 「BZOJ3343」教主的魔法(分块+二分查找)

    题意: 给定一个数列,您需要支持以下两种操作:给[l,r]同加一个数询问[l,r]中有多少数字大于或等于v (n<=1000000,m<=3000) 题解 块内排序二分查询修改就用个数组存 ...

  6. 转载 :Linux有问必答:如何在Debian或Ubuntu上安装完整的内核源码

    http://linux.cn/article-5015-1.html 问题:我需要为我的Debian或Ubuntu下载并安装完整树结构的内核源码以供编译一个定制的内核.那么在Debian或Ubunt ...

  7. 【J-meter】调试JDBC请求

    参考资料: http://www.codesec.net/view/165234.html

  8. js或css指定元素点击时内容不可被选中

    一.css3中可以使用"user-select"属性: body{ -webkit-user-select:none;/*谷歌 /Chrome*/ -moz-user-select ...

  9. Eclipse反编译插件 Enhanced Class Decompiler

    因为jar包中的源码都是经过反编译的,所以需要安装插件才能查看到源码,此处介绍的是 Enhanced Class Decompiler 插件. 打开Eclipse,Help --> Eclips ...

  10. error C2440: “static_cast”: 无法从“LRESULT (__thiscall CTextProgressCtrl::* )(UINT,LPCTSTR)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)

    转自原文 error C2440 “static_cast” 无法从“void (__thiscall C* )(void)... error C2440: “static_cast”: 无法从“LR ...