一、计算一串字符串的最终值,相当于eval函数功能:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
#Author:chenxz
import re
def check(s): #检查字符串函数是否合法
s=s.replace(' ','').strip() #去除空格
if len(re.findall('\(',s)) != len(re.findall('\)',s)):#判断括号是否成对
print("括号不匹配")
exit()
if re.search('(\([*+/])|([*+\-/]\))',s): #判断是否含(*/+ 或+-*/) 这种不合法的
print('格式不正确')
exit()
return s def count_last(sub_str): #处理n[+-*/]mg格式计算值
sub_str=re.sub('\+-','-',sub_str) #格式化
sub_str=re.sub('--', '+', sub_str) #格式化
if '*' in sub_str: #计算乘
sub_list=sub_str.split('*')
res=str(float(sub_list[0])*float(sub_list[1]))
elif '/' in sub_str: #计算除
sub_list=sub_str.split('/')
res=str(float(sub_list[0])/float(sub_list[1]))
elif '+' in sub_str: #计算加
sub_list=sub_str.split('+')
res=str(float(sub_list[0])+float(sub_list[1]))
elif '-' in sub_str: #计算减
sub_list=sub_str.split('-')
res=str(float(sub_list[0])-float(sub_list[1]))
return res def count_mid(cal_str): #处理类似(1+3*5)的字符串中间函数
cal_str = cal_str[1:-1] #去除括号
while re.search('\d+\.?\d{0,}[*/]-?\d+\.?\d{0,}',cal_str): #循环匹配乘除
sub_str=re.search('\d+\.?\d{0,}[*/]-?\d+\.?\d{0,}',cal_str).group()
res=count_last(sub_str)#子函数计算n[*/]m返回对应值
cal_str=cal_str.replace(sub_str,res)#对应值替代
while re.search('\d+\.?\d{0,}[+\-]-?\d+\.?\d{0,}',cal_str):#循环匹配加减
sub_str=re.search('\d+\.?\d{0,}[+\-]-?\d+\.?\d{0,}',cal_str).group()
res=count_last(sub_str)#子函数计算n[+-]m返回对应值
cal_str=cal_str.replace(sub_str,res) #对应值替代
return cal_str s= '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
s=check(s) #检查输入的合法性
while re.search('\([^()]+\)',s): #循环将最里面的括号找出来
cal_str=re.search('\([^()]+\)',s).group()
res=count_mid(cal_str) #最里面的括号和表达式,通过处理函数返回对应值
s=s.replace(cal_str,res) #对应值替代
s=count_mid('(%s)'%s) #去除完括号之后的字符串,加上括号给count_mid函数能自动计算除结果
print(s) #2776677.4952380955

计算器程序编写_python的更多相关文章

  1. 纯javascript代码编写计算器程序

    今天来分享一下用纯javascript代码编写的一个计算器程序,很多行业都能用到这个程序,例如做装修预算.贷款利率等等. 首先来看一下完成后的效果: 具体代码如下:(关注我的博客,及时获取最新WEB前 ...

  2. 逆向project第004篇:令计算器程序显示汉字(下)

    一.前言 钩子技术是一项很有有用价值的技术.在Windows下HOOK技术的方法比較多,使用比較灵活,常见的应用层的HOOK方法有Inline HOOK(详见<反病毒攻防研究第012篇:利用In ...

  3. 20151009 C# 第一篇 程序编写规范

    20151009 程序编写规范 1. 代码书写规则: 1).尽量使用接口,然后使用类实现接口. 2).关键语句写注释 3).避免写超过5个参数的方法,如果要传递多个参数,则使用结构 4).避免代码量过 ...

  4. 基于DCMTK的DICOM相关程序编写攻略

    2008年09月10日 星期三 15:35 基于DCMTK的DICOM相关程序编写攻略 前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的过程中,经常 ...

  5. 单利 复利计算器程序1.0 2.0 3.0 [ 合 ] 之 WEB

    对单复利计算器程序进行改进 更新为网页版的. 界面不太美观 请谅解 由于时间问题暂未完善好! 计算部分的主要源代码:

  6. Android Camera 相机程序编写

    Android Camera 相机程序编写 要自己写一个相机应用直接使用相机硬件,首先应用需要一个权限设置,在AndroidManifest.xml中加上使用设备相机的权限: <uses-per ...

  7. HTML5 canvas绘制雪花飘落动画(需求分析、知识点、程序编写分布详解)

    看到网上很多展示html5雪花飞动的效果,确实非常引人入胜,我相信大家也跟我一样看着心动的同时,也很好奇,想研究下代码如何实现:虽然哦很多地方也能下载这些源码,不过也不知道别人制作此类动画时的思路及难 ...

  8. 从mina中学习超时程序编写

    从mina中学习超时程序编写 在很多情况下,程序需要使用计时器定,在指定的时间内检查连接过期.例如,要实现一个mqtt服务,为了保证QOS,在服务端发送消息后,需要等待客户端的ack,确保客户端接收到 ...

  9. 基于Asterisk的VoIP开发指南——(2)Asterisk AGI程序编写指南

    原文:基于Asterisk的VoIP开发指南--(2)Asterisk AGI程序编写指南 5. Asterisk AGI程序编写指南 5.1概述 很多时候,我们需要在拨号方案中做某些业务逻辑的判断或 ...

随机推荐

  1. golang单元测试简述

      Golang中内置了对单元测试的支持,不需要像Java一样引入第三方Jar才能进行测试,下面将分别介绍Golang所支持的几种测试: 一.测试类型   Golang中单元测试有功能测试.基准测试. ...

  2. 聊聊GIS中的坐标系|再版 识别各种数据的坐标系及代码中的坐标系

    本篇讲讲在GIS桌面软件和实际数据中,以及各路GIS有关API的编程中,如何寻找坐标系信息.惯例: 本文约2000字,建议阅读时间10分钟. 作者:博客园/B站/知乎/csdn/小专栏 @秋意正寒 版 ...

  3. mysql添加索引(建表之后)

    一.使用ALTER TABLE语句创建索引 语法如下: alter table table_name add index index_name (column_list) ; alter table ...

  4. Linux_simpl shell-利用Shell脚本for循环输出系统中的用户及其Shell

    [root@localhost ~]# vim user.sh 1 #!/bin/bash 2 for i in `cut -d ":" -f1 /etc/passwd`; 3 d ...

  5. jmeter-json提取器提取的内容含”引号

    这时如果直接赋值会报错  解决方法: 1.用vars.get("Object")提取变量的值 2.用代码提取,最后把提取到的Object或Array转为String

  6. mysql-主从备份问题小结

    一:防火墙 常用命令 firewall-cmd --state 或 systemctl status firewalld # 查看状态 systemctl start firewalld# 启动 sy ...

  7. 自定义配置JNOJ

    OJ 全名 online judge 在线判题系统,对于从事编程竞赛的人来说一点都不陌生,今天我们讨论的是怎么样自定义搭建 推荐的开源的OJ有hustOJ,JNOJ 因为hustOJ 是一键安装脚本, ...

  8. CF #618 div.2

    序 闲来无事,打场CF,本人蒟蒻,考场A了前三道,第四有解答 正文 T1 Non-zero 是道水题.... 给你一个序列a.要求你输出最少的操作次数使这个序列的累和与累乘都不为0: 一次操作指给\( ...

  9. SpringBoot从1.5.1→2.2.4项目加包扫雷二:打不到符号java: org.springframework.boot.autoconfigure.web.相关配置错误支持包

    import org.springframework.boot.autoconfigure.web.DefaultErrorAttributes→org.springframework.boot.we ...

  10. xshell远程打开Linux图形界面加速方法:

    https://blog.csdn.net/zyy247796143/article/details/82143832 服务器安装: yum install Xvfb    :在安装完谷歌浏览器后,安 ...