import re

 def calc(formula):
formula = re.sub(' ', '', formula)
formula_ret = 0
match_brackets = re.search(r'\([^()]+\)', formula)
if match_brackets:
calc_result = calc(match_brackets.group().strip("(,)"))
formula = formula.replace(match_brackets.group(), str(calc_result))
return calc(formula)
else:
formula = formula.replace('--', '+').replace('++', '+').replace('-+', '-').replace('+-', '-')
while re.findall(r"[*/]", formula):
get_formula = re.search(r"[.\d]+[*/]+[-]?[.\d]+", formula)
if get_formula:
get_formula_str = get_formula.group()
if get_formula_str.count("*"):
formula_list = get_formula_str.split("*")
ret = float(formula_list[0]) * float(formula_list[1])
else:
formula_list = get_formula_str.split("/")
ret = float(formula_list[0]) / float(formula_list[1])
formula = formula.replace(get_formula_str, str(ret)).replace('--', '+').replace('++', '+')
formula = re.findall(r'[-]?[.\d]+', formula)
for num in formula:
formula_ret += float(num)
return formula_ret
# calc_str = input('>>>')
calc_str = '1-2*((60-30+(-40---5)*(9-2*5/3+7/3*99/4*2998+ 10*568/ 14))-(-4*3)/(16-3*2))'
print(eval(calc_str))
formula_result = calc(calc_str)
print(formula_result)

带基本验证

 import re
invalid_str_re = re.compile(r'[*/]{3,}|[%]{2,}|\([*/%]+\d+|^[*/%]+\d+|\(+\)+|\d+[-+*/%]+$|\)+\(+|\d+[-+*/%]+\)|\d+\(+') def decorate(func):
def wrapper(formula):
formula = re.sub(' ', '', formula)
valid_str = re.findall(r'[-+*/%.()\d]+', formula)
invalid_str = invalid_str_re.findall(formula)
if (valid_str and len(valid_str[0]) != len(formula)) or invalid_str:
return False
return func(formula)
return wrapper @decorate
def calc(formula):
formula = re.sub(' ', '', formula)
formula_ret = 0
match_brackets = re.search(r'\([^()]+\)', formula)
if match_brackets:
calc_result = calc(match_brackets.group().strip("(,)"))
formula = formula.replace(match_brackets.group(), str(calc_result))
return calc(formula)
else:
formula = formula.replace('--', '+').replace('++', '+').replace('-+', '-').replace('+-', '-')
while re.findall(r"[*/]", formula):
get_formula = re.search(r"[.\d]+[*/]+[-]?[.\d]+", formula)
if get_formula:
get_formula_str = get_formula.group()
if get_formula_str.count("*"):
formula_list = get_formula_str.split("*")
ret = float(formula_list[0]) * float(formula_list[1])
else:
formula_list = get_formula_str.split("/")
ret = float(formula_list[0]) / float(formula_list[1])
formula = formula.replace(get_formula_str, str(ret)).replace('--', '+').replace('++', '+')
formula = re.findall(r'[-]?[.\d]+', formula)
for num in formula:
formula_ret += float(num)
return formula_ret
# calc_str = input('>>>')
calc_str = '1-2*((60-30+(-40---5)*(9-2*5/3+7/3*99/4*2998+ 10*568/ 14))-(-4*3)/(16-3*2))'
formula_result = calc(calc_str)
print(formula_result)

python实现最简单的计算器功能源码的更多相关文章

  1. 出售Illustrator脚本插件面板(包含面板源码,以及面板上所有的功能源码)

    出售Illustrator脚本插件面板(包含面板源码,以及面板上所有的功能源码) 购买后可提供相应的小修改,以及教你使用往这个多列面里再加上按钮功能! 这套源码可作为工作使用,也可用为新手学习AI脚面 ...

  2. Python 设计一个简单的计算器

    设计目标 实现加减乘除及拓号优先级解析 用户输入'1 - 2 * ( (6-3 +(-5/5)*(9-2*3/3 + 7/3*7/4*12 +10 * 5/5 )) - (-4*3)/ (12-3*2 ...

  3. 微信跳转外部浏览器打开指定H5链接的功能源码

    通常大家在微信内转发分享H5链接的时候都很容易碰到H5链接在微信内无法打开或在微信内无法打开app下载页的情况.通常这种情况微信会给个提示 “已停止访问该网址” ,那么导致这个情况的因素有哪些呢,主要 ...

  4. 构建NetCore应用框架之实战篇(七):BitAdminCore框架登录功能源码解读

    本篇承接上篇内容,如果你不小心点击进来,建议从第一篇开始完整阅读,文章内容继承性连贯性. 构建NetCore应用框架之实战篇系列 一.简介 1.登录功能完成后,框架的雏形已经形成,有必要进行复习. 2 ...

  5. 开源安卓Android流媒体音视频播放器实现声音自动停止、恢复、一键静音功能源码

    本文转自EasyDarwin团队John的博客:http://blog.csdn.net/jyt0551/article/details/60802145 我们在开发安卓Android流媒体音视频播放 ...

  6. elasticsearch index 功能源码概述

    从本篇开始,对elasticsearch的介绍将进入数据功能部分(index),这一部分包括索引的创建,管理,数据索引及搜索等相关功能.对于这一部分的介绍,首先对各个功能模块的分析,然后详细分析数据索 ...

  7. HashMap核心功能源码浅析

    1.引子 "HashMap"由“hash”和“map"两个单词组成,这里的”map"表示“映射”而不是“地图”的意思,两个单词连起来就是“哈希映射表”.Map是 ...

  8. ios自动滚动图片功能源码

    源码AdScrollerView,一个已经封装好的UIScrollView的子类,可以自动滚动图片以及对应的描述语,类似淘宝app首页的广告滚动效果.滚动图片数量不限,并且显示pageControl. ...

  9. .net 邮件批量发送功能源码

    #define debug   using System; using System.Text; using System.Linq; using System.IO; using System.Ne ...

随机推荐

  1. java性能调优及问题追踪--Btrace的使用

    在生产环境中经常遇到格式各样的问题,如OOM或者莫名其妙的进程死掉.一般情况下是通过修改程序,添加打印日志:然后重新发布程序来完成.然而,这不仅麻烦,而且带来很多不可控的因素.有没有一种方式,在不修改 ...

  2. 企业号查询部门id(改版后)

    1.搜索部门,输入"名称" 2.在后面可以查到部门ID

  3. php链接数据库 批量删除 和 注册审核

    理解 :  hiden   value    session   name="a[]"         1.  form  表单上传的 value=" "值   ...

  4. sh4.case语句

    case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构.case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令.case语句格式如下: ...

  5. git tag使用标记

    git跟其它版本控制系统一样,可以打标签(tag), 作用是标记一个点为一个版本号,如0.1.3, v0.1.7, ver_0.1.3.在程序开发到一个阶段后,我们需要打个标签,发布一个版本,标记的作 ...

  6. 7.iOS Notification

    1. 通知中心认识 通知中心实际上是在程序内部提供了消息广播的一种机制.通知中心不能在进程间进行通信,它只能进行程序内部通信,不能跨应用程序进程通信.通知中心,当通知中心接受到消息后会根据设置,根据内 ...

  7. DB2错误码信息

    00 完全成功完成 表 3  01 警告 表 4  02 无数据 表 5  07 动态 SQL 错误 表 6  08 连接异常 表 7  09 触发操作异常 表 8  0A 功能部件不受支持 表 9  ...

  8. Android 自定义ToolBar详细使用

    自定义xml设置ToolBar,通过menu文件扩展选项,通过继承baseactivity使用 1.ToolBar布局 <?xml version="1.0" encodin ...

  9. Andriod学习笔记2:“Your content must have a ListView whose id attribute is 'android.R.id.list'”问题的解决办法

    问题描述 activity_main.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <Lin ...

  10. Mysql调整字段顺序

    1.增加(add/modify/change)一个字段使之位于第1列 alter table table_name add `id` int first; 2.增加一个字段使之位于某列后 alter ...