思路:学会运用正则表达式把需要先进行计算的匹配出来,然后再一步步的去算,把先算出来的值替换原来的值,再进一步的把++,--等号变成我们正常的数学上的符号,然后再进行一步步的替换,最终把带括号的都计算出来,再调用一次加减函数进行计算

import re

def atom_cal(exp):      #计算乘除法
if "*" in exp:
a,b = exp.split("*") #以*作切割,把切出来的两个值分别赋给a,b
return str(float(a) * float(b)) #用float计算ab相乘的值并转换成字符串格式,便于计算
else:
a,b = exp.split("/") #以/作切割,把切出来的两个值分别赋给a,b
return str(float(a) / float(b)) def mul_div(exp): #乘除
while 1:
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 #当没有相匹配的乘除法时,返回exp def format_exp(exp): #改变符号
exp = exp.replace("--","+")
exp = exp.replace("-+","-")
exp = exp.replace("+-","-")
exp = exp.replace("++","+")
return exp def add_sub(exp): #计算加减
ret = re.findall("[+-]?\d+(?:\.\d+)?",exp) #把能加减的匹配出来,包括小数,负数等
exp_sum = 0
for i in ret:
exp_sum += float(i) #累加至exp_sum中返回
return exp_sum def cal(exp):
exp = mul_div(exp) #乘除
exp = format_exp(exp) #变号
exp_sum = add_sub(exp) #加减
return exp_sum #float def main(exp):
exp = exp.replace(" ","")#去空格
while 1:
ret = re.search("\([^()]+\)",exp) #括号最里面的数
if ret:
inner_bracket = ret.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) )'
print(main(s))

Python之简易计算器的更多相关文章

  1. Python之实现一个简易计算器

    自己动手写计算器 一.功能分析 用户输入一个类似这样 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 这样的表达式,假设表达式里 ...

  2. python + PyQt5 实现 简易计算器

    忽然想起之前一直想写个简单的计算器,今天就写了一下,界面有些简陋,但是基本功能实现没有问题 以下是源码: # --*-- coding:utf-8 --*-- import sys from PyQt ...

  3. Python正则表达计算器

    Python学习笔记(十二): 计算器 利用Python的正则表达式写的简易计算器 # author : Ryoma # time : 17:39 import re def add(string): ...

  4. 自制c#简易计算器

    这是一个课堂作业,我觉得作为一个简易的计算器不需要态度复杂的东西,可能还有一些bug,有空再慢慢加强. using System;using System.Collections.Generic;us ...

  5. 剖析简易计算器带你入门微信小程序开发

    写在前面,但是重点在后面 这是教程,也不是教程. 可以先看Demo的操作动图,看看是个什么玩意儿,GitHub地址(https://github.com/dunizb/wxapp-sCalc) 自从微 ...

  6. PHP学习笔记02——简易计算器

    <!DOCTYPE html> <html> <head> <title>PHP简易计算器</title> </head> &l ...

  7. JavaScript之简易计算器

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  8. 菜鸟学习Struts——简易计算器

    这是学习Struts的一个简单的例子文件结构如下: 1.配置Struts环境 2.新建input.jsp,success.jsp,error.jsp input.jsp代码如下: <%@ pag ...

  9. 使用HTML+CSS,jQuery编写的简易计算器

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

随机推荐

  1. win7 32位安装 python 及Numpy、scipy、matplotlib函数包

    操作系统: win7 64位,但选择安装32位的python. 1,python下载安装 https://www.python.org/downloads/ 下载2.7版,一路下一步安装. 并在pat ...

  2. Python学习——输入和输出

    (转自:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316434841 ...

  3. String与字符数组

    public class Example { static String str = new String("good"); static char[] ch = {'a','b' ...

  4. sublime插件-OmniMarkupPreviewer浏览器打开报404解决办法

    Sublime Text > Preferences > Package Settings > OmniMarkupPreviewer > Settings - Default ...

  5. Sharepoint2013商务智能学习笔记之Excel Service展示Sql Server数据Demo(五)

    第一步,打开Excel新建空白工作簿 第二步,使用Excel连接sql 数据库 第三步,画图 第四步 添加筛选器 最后效果如下: 第五步,将Excel上传到sharepoint任意文档库,并直接点击 ...

  6. 【linux下-远程访问mysql数据库报错问题】

    虚拟机跑Linux项目用到MySQL数据库,可是远程连接MySQL时总是报出erro 2003: Can't connect to MySQL server on '211.87.***.***' ( ...

  7. Oracle 11g 、 Oracle 11g select 、 PLSQL 、 Sql Server迁移助手(SSMA)6.0/7.1 网盘下载地址

    - - - - - - - - 链接: https://pan.baidu.com/s/1q-uwAfeLOPxzBBx6V1pYLg 提取码: hei9

  8. iscsi使用教程(下)

    动态创建目标 安装iscsi服务端 # yum install -y scsi-target-utils.x86_64 修改配置文件 # mkdir -p ~/volumes # sed -i '$ ...

  9. 【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)

    Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是 ...

  10. Java Web中相对路径与绝对路径的分析

    一.相对路径与绝对路径 1.相对路径: 相对路径指的是相对于当前文件所在目录的路径! 相对路径易出问题: 当在页面间相互跳转时不会产生问题: 当从Servlet中转发到指定页面时,服务器会相对于当前S ...