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 连接接数据库 中的代码 放到配置文件中

    1.DButil.java package com.jobproject.util; import java.sql.Connection;import java.sql.DriverManager; ...

  2. PostgreSQL 允许远程访问设置方法

     安装PostgreSQL数据库之后,默认是只接受本地访问连接.如果想在其他主机上访问PostgreSQL数据库服务器,就需要进行相应的配置. 配置远程连接PostgreSQL数据库的步骤很简单,只需 ...

  3. 使用ajaxfileupload.js实现上传文件功能

    <div class="pictureList"> <div class="pictureItem" id="uploadItem& ...

  4. CC2540自己的配置文件

    首先要指出,字段属性有notify的不能同时有read,write属性,别问哥,哥也不知道,反正我做的就不能notify,只能read,write. 分享的程序段第一字段有notify属性,第二字段r ...

  5. PLSQLDeveloper 常用设置

    PLSQL Developer常用设置及快捷键   1.登录后默认自动选中My Objects (已验证可用)   默认情况下,PLSQL Developer登录后,Brower里会选择All obj ...

  6. 修改linux文件权限

    Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文件为例,只读权限表示只允许读其内容,而禁 ...

  7. Linux Memcached安装以及PHP扩展安装

    一:安装libevent 由于memcached安装时,需要使用libevent类库,所以先安装libevent 1.下载 #wget   http://www.monkey.org/~provos/ ...

  8. CoreData __ 基本原理

    操作过程 Context想要获取值,先要告诉连接器,我要什么东西 链接器再告诉store, 你给我什么东西, store去找 找到之后返回给链接器,链接器再返回给Context          Co ...

  9. 一、常见PHP网站安全漏洞

    对于PHP的漏洞,目前常见的漏洞有五种.分别是Session文件漏洞.SQL注入漏洞.脚本命令执行漏洞.全局变量漏洞和文件漏洞.这里分别对这些漏洞进行简要的介绍. 1.session文件漏洞 Sess ...

  10. 安天AVL联合小米MIUI首擒顽固病毒“不死鸟”

    不死鸟作为希腊神话中的一种怪物,拥有不断再生的能力,每当寿限将至时,它会在巢穴中自焚,并在三天后重新复活.就在近期,安天AVL移动安全团队和小米MIUI安全中心发现了病毒界的“不死鸟”,其顽固程度之深 ...