计算下面表达式最后的结果
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. [转帖]Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)

    https://www.cnblogs.com/monjeo/p/12191673.html 权限简介Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方 ...

  2. [转帖]Springboot配置kafka用户名密码

    华为云开发者联盟 Springboot配置kafka用户名密码 Springboot配置kafka用户名密码 SpringBoot配置kafka用户名密码 Springboot配置kafka用户名密码 ...

  3. [转帖]军备芯片14nm对比5nm,在战场上差距在哪里?

    https://www.eet-china.com/mp/a207185.html 现在全球已经打响科技之战,每个国家都在力求让自己做到足够拔尖.美国商务部长就曾自曝家底说,美国制定两套战略应对在芯片 ...

  4. 【转帖】通过pip命令安装好包之后,在pycharm中不显示此库,也不能调用

    目录 1. 问题描述 2. 解决方法1 3. 解决方法2 1. 问题描述 在cmd输入pip list 命令可以看到我的库都已经安装好了,但是pycharm中却没有显示. 在PyCharm查找,并没有 ...

  5. Python学习之四_部分battery的学习

    Python学习之四_部分battery的学习 CentOS升级pip的方法 yum install python3 之后, 一般centos的版本都很低, 有时候很多module 是无法安装的. 一 ...

  6. 关于async函数的错误处理

    1. 关于async函数的错误处理 有些时候,我们请求的接口可能会报错: 从而导致后面的代码无法去执行: 这样就会造成页面上某些状态出错! 那么怎么样才能 既能捕获到错误 还能让代码往后面执行呢 2. ...

  7. Fabric区块链浏览器(1)

    本文是区块链浏览器系列的第三篇,本文介绍区块链浏览器的主体部分,即区块数据的解析. 这一版本的区块链浏览器是基于gin实现的,只提供三种接口: /block/upload:POST,上传Protobu ...

  8. Fabric网络升级(二)

    原文来自这里. 如果想了解最新版Fabric的特殊事项,详见Upgrading to the latest release of Fabric. 本章只介绍更新Fabric组件的操作.关于如何通过编辑 ...

  9. 发布.net core应用程序并部署到IIS上

    一.在项目里右击选择发布点击启动配置如下图所示 二.在打开的发布选项选择 配置 Release或DeBug ,目标框架选择对应的.net Core版本默认就行,部署模式有两种选择 1.框架依赖---- ...

  10. 8.1 TEB与PEB概述

    在开始使用TEB/PEB获取进程或线程ID之前,我想有必要解释一下这两个名词,PEB指的是进程环境块(Process Environment Block),用于存储进程状态信息和进程所需的各种数据.每 ...