假如我们有这样一个式子:

1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
思路:按照逻辑应该先算括号里面的
   然后在算括号外面的
   所以我们就可以将所有内层括号里面的算式找出来
   应该是"(-40/5)","(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14)","(-4*3)","(16-3*2)"这样的
   而括号里面应该是先算乘除法,然后再算加减法
   将这些值算出来之后,然后将原来带括号的式子用算出来的值给他替换掉
   然后在找有没有括号,如果有就继续一次上面个的操作
   将带括号的算式计算完之后
   最后再进行加减乘除运算,之后得出的结果就是运算结果
下面个见代码:
import re
def atom_cal(exp):
if '*' in exp: #计算单个的乘法
a,b = exp.split('*')
return str(float(a) * float(b))
elif '/' in exp: #计算单个的除法
a, b = exp.split('/')
return str(float(a) / float(b)) def format_exp(exp): #处理符号的问题
exp = exp.replace('--','+')
exp = exp.replace('+-','-')
exp = exp.replace('-+','-')
exp = exp.replace('++','+')
return exp def mul_div(exp): #计算乘除法
while True:
ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp) #利用正则表达式匹配乘或除法
if ret: #如果匹配到的话
atom_exp = ret.group() #将这个值拿出来
res = atom_cal(atom_exp) #调用上面个的atom_cal计算
exp = exp.replace(atom_exp,res) #将计算的结果把原来的算是替换掉
else:return exp #如果匹配不到的话说明乘除法计算完毕,返回计算结果 def add_sub(exp): #计算加减法
ret = re.findall('[+-]?\d+(?:\.\d+)?', exp) #利用正则表达式匹配算式中的带符号的每项数字,返回一个列表
exp_sum = 0
for i in ret:
exp_sum += float(i) #将列表中的每一项求和
return exp_sum def cal(exp): #计算加减乘除混合运算
exp = mul_div(exp) #调用mul_div函数先计算乘除法
exp = format_exp(exp) #调用format_exp处理计算时候的符号
exp_sum = add_sub(exp) #调用add_sub计算加减法
return exp_sum # float #返回计算结果 def main(exp):
exp = exp.replace(' ','') #删除字符串中的空格
while True:
ret = re.search('\([^()]+\)',exp) #匹配括号
if ret : #如果匹配到的话
inner_bracket = ret.group() #用group()将匹配到的括号内容取出来
res = str(cal(inner_bracket)) #调用cal()计算括号中的内容,将返回的结果转换成字符串
exp = exp.replace(inner_bracket,res) #将匹配到的括号中的内容用计算结果替换
exp = format_exp(exp) #处理符号
else:break #直到没有括号跳出循环
return cal(exp) #将剩下的内容进行计算,然后返回 s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
ret = main(s)
print(ret) 最后结果:
2776672.6952380957
加法运算解释:9+6-9+5+8-6-5
  这样的算式我们可以把它看成是9+(+6)+(-9)+(+5)+(+8)+(-6)+(-5)
   
 

用python语言写一个简单的计算器的更多相关文章

  1. 【阿菜做实践】利用go语言写一个简单的Pow样例

    本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简单demo.开发IDE用的是JB Golang. 整个项目的文件结构如下: PoWdem ...

  2. 用JavaScript写一个简单的计算器

    本文使用js实现了一个简单的加.减.乘.除计算器. 以下是css部分代码: *{ padding:0; margin:0; color: #424242; } .outer{ width:300px; ...

  3. 用c++写一个简单的计算器程序

    // 050305.cpp : 定义控制台应用程序的入口点.// // 050304.cpp : 定义控制台应用程序的入口点.////四则运算#include "stdafx.h" ...

  4. js eval函数写一个简单的计算器

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. 用Go语言实现一个简单的聊天机器人

    一.介绍 目的:使用Go语言写一个简单的聊天机器人,复习整合Go语言的语法和基础知识. 软件环境:Go1.9,Goland 2018.1.5. 二.回顾 Go语言基本构成要素:标识符.关键字.字面量. ...

  6. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  7. 利用windows.h头文件写一个简单的C语言倒计时

    今天写一个简单的倒计时函数 代码如下: #include<stdio.h> #include<windows.h> int main() { int i; printf(&qu ...

  8. 用node.js从零开始去写一个简单的爬虫

    如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...

  9. 如何写一个简单的http服务器

    最近几天用C++写了一个简单的HTTP服务器,作为学习网络编程和Linux环境编程的练手项目,这篇文章记录我在写一个HTTP服务器过程中遇到的问题和学习到的知识. 服务器的源代码放在Github. H ...

随机推荐

  1. flex多列布局遇到的问题,和解决方案

    flex布局无疑是简单.易用的,他让我我们的布局更加简单和快速,但是在使用flex进行多列布局的时候,我相信很多人会遇到下面的情况: 这种情况是因为我们使用了justify-content: spac ...

  2. react入门----(this.state/表单/Ajax)

    1.this.state 组件免不了要与用户互动,React 的一大创新,就是将组件看成是一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染 UI var TestStat ...

  3. 《Spring in action》之Spring之旅

    Spring框架作用是简化java开发的复杂性.下面是spring in action 对spring初步介绍. 一.主要有4种关键策略: 1. 基于POJO的轻量级和最小侵入性编程 . 2. 通过依 ...

  4. [poj2425]A Chess Game_博弈论

    A Chess Game poj-2425 题目大意:题目链接 注释:略. 想法:这个题就是为什么必须要用记忆化搜索.因为压根就不知道后继是谁. 我们通过SG定理可知:当前游戏的SG值等于所有子游戏的 ...

  5. POJ——1061 青蛙的约会

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 117858   Accepted: 24599 Descript ...

  6. Ubuntu 16.04下轻量级文件搜索工具Catfish

    Catfish搜索文件速度快,但是不支持正则表达式. 安装: sudo add-apt-repository ppa:catfish-search/ppa sudo apt-get update su ...

  7. Ubuntu 16.04设置开机启动应用程序

    在终端通过以下命令进行设置,Dash已经搜索不到Startup了: gnome-session-properties 或者直接在Dash中搜索:gnome-session

  8. 《深入理解PHP内核》

    http://www.php-internals.com/ http://www.cnblogs.com/zcy_soft/category/252731.html

  9. jq超简单的流式布局,代码简单,容易修改

    1.看看效果吧! 2.html代码index.html <!DOCTYPE html> <html lang="en"> <head> < ...

  10. nodejs 运行

    运行 Node.js 程序的基本方法就是执行 node script.js,其中 script.js①是脚本的文件名. 除了直接运行脚本文件外,node --help 显示的使用方法中说明了另一种输出 ...