计算下面表达式最后的结果
strvar = "1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"

# ### 正则计算器
import re
strvar = "1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))" # 2776672.6952380957
# strvar = "-30+(40+5*-2+3/2)*8 + (4- 7) " print(eval(strvar)) # 2776672.6952380957 # 处理符号
def sign_exp(strvar):
strvar = strvar.replace("+-","-")
strvar = strvar.replace("--","+")
strvar = strvar.replace("-+","-")
strvar = strvar.replace("++","+")
return strvar # 计算表达式
def calc_exp(strvar):
# 判断字符串是 乘法 还是 除法
if "*" in strvar:
a,b = strvar.split("*")
return float(a) * float(b) if "/" in strvar:
a,b = strvar.split("/")
return float(a) / float(b) # 操作表达式
def opreate_exp(strvar):
# 先算乘除
while True:
# (40+5*-2+3/2)
# 匹配 [谁*谁] 或者 [谁/谁] 例: 5*-2 3/2
obj = re.search(r"\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?",strvar)
if obj:
res1 = obj.group()
# print(res1) # 5*-2
# 计算表达式的结果
res2 = calc_exp(res1)
# print(res2 , type(res2)) # -10.0 <class 'float'>
# 将所得的结果,替换到原来的字符串当中,以匹配下一个乘法或者除法
strvar = strvar.replace(res1,str(res2))
# print(strvar) # (40+-10.0+3/2)
else:
# 当obj 返回None的时候停止
break # 处理表达式中的符号
strvar = sign_exp(strvar)
# print(strvar) # (40+-10.0+1.5) (40-10.0+1.5) # 计算剩下+-的表达式(将每一个数字匹配出来,做累加)
lst = re.findall("[+-]?\d+(?:\.\d+)?",strvar)
# print(lst) # ['40', '-10.0', '+1.5']
total = 0
for i in lst:
total += float(i)
# print(total) # 31.5
return total # 移除括号
def remove_bracket(strvar):
while True:
obj = re.search("\([^()]+\)",strvar)
# print(obj)
if obj:
res1 = obj.group()
# print(res1) # (40+5*-2+3/2) "-30+(40+5*-2+3/2)*8 +(4-7)"
# 计算一个括号里面表达式的值
res2 = opreate_exp(res1)
# print(res2) # 31.5
# 替换原来的括号,消除括号
strvar = strvar.replace(res1,str(res2))
# print(strvar) # -30+31.5*8+(4-7)
else:
return strvar # 返回一串没有括号的表达式 # main函数当中不写逻辑,只调用相关的功能
def main(strvar):
# 1.整理数据,把没用的空格去掉
strvar = strvar.replace(" ","")
# 2.移除所有括号
strvar = remove_bracket(strvar)
# print(strvar) # -30+31.5*8+-3.0
# 3.计算表达式
return opreate_exp(strvar) res = main(strvar)
print(res)

正则计算器---day19的更多相关文章

  1. DSB

    Linux day01 计算机硬件知识整理 作业要求:整理博客,内容如下 编程语言的作用及与操作系统和硬件的关系 应用程序->操作系统->硬件 cpu->内存->磁盘 cpu与 ...

  2. python 作业

    Linux day01 计算机硬件知识整理 作业要求:整理博客,内容如下 编程语言的作用及与操作系统和硬件的关系 应用程序->操作系统->硬件 cpu->内存->磁盘 cpu与 ...

  3. 开发语言之---Python

    Python,如果你想进军AI,或是不想被自动化运维淘汰,Python是一门必须课. 在未来的大学课堂上,也许也会将Python加入必修中,就像Java一样. Python之“Hello World” ...

  4. python 正则的使用 —— 编写一个简易的计算器

    在 Alex 的博客上看到的对正则这一章节作业是编写一个计算器,要求能计算出下面的算式. 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 + ...

  5. python正则实现简单计算器

    利用正则实现计算器 利用正则来实现简单计算器的功能,能够设计计算带括号的加减乘除运算.当然不使用eval等语句. 利用递归: import re from functools import reduc ...

  6. Python 正则实现计算器

    # !/usr/bin/env/ python3 # -*- coding: utf-8 -*- """用户输入计算表达式,显示计算结果""" ...

  7. Python实例---利用正则实现计算器[参考版]

    利用正则进行运算规则的计算 版本一: # import re # # ss = '1 - 2 * ((60 - 30 + (-40/5) * (9 - 2 * 5 / 3 + 7 / 3 * 99 / ...

  8. Python实例---利用正则实现计算器[FTL版]

    import re # 格式化 def format_str(str): str = str.replace('--', '+') str = str.replace('-+', '-') str = ...

  9. python 计算器的(正则匹配+递归)

    经过2天的长时间的战斗,python计算器终于完成了. import re val="1-2*((60-30*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3 ...

  10. Python正则表达计算器

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

随机推荐

  1. [转帖]jumpserver (Linux资产管理快速入门)

    准备工作 准备三台虚拟机,一台作为jumpserver的服务端,两台作为测试端. 一.安装好jump server后,输入IP地址登录 [192.168.2.111为本机测试地址] 二.创建用户组 这 ...

  2. [转帖]03-rsync传输模式(本地传输、远程方式传输、守护进程模式传输)

    https://developer.aliyun.com/article/885801?spm=a2c6h.24874632.expert-profile.282.7c46cfe9h5DxWK 简介: ...

  3. 准备学习 make

    make -h用法:make [选项] [目标] ...选项: -b, -m 为兼容性而忽略. -B, --always-make 无条件制作 (make) 所有目标. -C 目录, --direct ...

  4. 服务器Raid配置的一些思考

    背景 随着公司软件的发展.客户越来越多. 测试环境和兼容环境也越来越多. 不管是虚拟化,还是裸金属做数据库 存储都是绕不开的一道门槛. 最近又上架了几台服务器, 所以想趁着周末总结一下 最近服务器上架 ...

  5. 自己想的一些判断存储长度的sql

    create table zhaobsh (t1 date ,t2 TIMESTAMP) insert into zhaobsh values (CURRENT_DATE,CURRENT_TIMEST ...

  6. Zabbix6.0的安装与IPMI的简单使用

    zabbix简介 1.zabbix的安装与使用 建议使用CentOS8进行部署, 不建议使用CentOS7, rpm包直接部署的话,CentOS8比较容易一些 支持mysql数据库.建议先期部署mys ...

  7. 基于Prometheus和Grafana监控redis,Oracle,mysql,pg以及sqlserver的方法总结

    基于Prometheus和Grafana监控redis,Oracle,mysql,pg以及sqlserver的方法总结 简单记录一下方法 1.获取相应的exporter 1. redis docker ...

  8. 京东云开发者|深入JDK中的Optional

    概述:Optional最早是Google公司Guava中的概念,代表的是可选值.Optional类从Java8版本开始加入豪华套餐,主要为了解决程序中的NPE问题,从而使得更少的显式判空,防止代码污染 ...

  9. 文盘Rust -- 领域交互模式如何实现

    作者:京东科技 贾世闻 文盘Rust -- 领域交互模式如何实现 书接上文,上回说到如何通过interactcli-rs四步实现一个命令行程序.但是shell交互模式在有些场景下用户体验并不是很好.比 ...

  10. 文盘Rust -- 安全连接 TiDB/Mysql

    作者:京东科技 贾世闻 最近在折腾rust与数据库集成,为了偷懒,选了Tidb Cloud Serverless Tier 作为数据源.Tidb 无疑是近五年来最优秀的国产开源分布式数据库,Tidb ...