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

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. 《精通Spring4.X企业应用开发实战》读后感第六章(引用Bean的属性值)

  2. Note: PANOPLY: Low-TCB Linux Applications with SGX Enclaves

    PANOPLY provides middleware for SGX and Linux operating systems. What PANOPLY provides middleware fo ...

  3. 【转】如何解决C盘根目录无法创建或写入文件

    源地址:http://blog.csdn.net/xinke453/article/details/7496545

  4. LibreOJ #6192. 「美团 CodeM 复赛」城市网络

    #6192. 「美团 CodeM 复赛」城市网络 内存限制:64 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: sqc 提交提交记录统计讨论测试数据   题目描 ...

  5. 为什么要把系统拆分成分布式的,为啥要用Dubbo?

    阅读本文大概需要 6 分钟. 作者:yanglbme 1.面试题 为什么要进行系统拆分?如何进行系统拆分?拆分后不用 dubbo 可以吗? 2.面试官心里分析 从这个问题开始就进行分布式系统环节了,好 ...

  6. 我的省选 Day -13

    Day -13 10:18:46 早上360浏览器的网站一直显示 证书错误! 打开洛谷,一脸懵逼,网页根本不能正常显示.(一直到刚刚改了一下系统时间才恢复正常) 好在已经把昨天那道矩阵乘法的题目做完了 ...

  7. AIDE,sudo,TCP_Wrappers,PAM认证等系统安全访问机制

    AIDE 高级入侵检测环境:是一个入侵检测工具,主要用途是检查文件的完整性,审计计算机上的那些文件被更改过了. AIDE能够构造一个指定文件的数据库,它使用aide.conf作为其配置文件.AIDE数 ...

  8. C 语言实例 - 创建各类三角形图案

    C 语言实例 - 创建各类三角形图案 创建三角形图案. 实例 - 使用 * 号 #include <stdio.h> int main() { int i, j, rows; printf ...

  9. JSP-用网页输出乘法表 三角形及菱形

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

  10. linux下apache无法启动之(httpd not running, trying to st)

    这突然接手的服务器,本来是没什么事的,可是因为机房的问题,需要将服务器迁回来,结果可想而知,关机重启了,其中有一台估计诚心给我过不去,待配置好ip并重启了服务后,发现apache无法正常启动了! 先还 ...