五一放假作业4.30 用正则表达式写一个计算器!去掉括号,计算式子结果!

作业要求:去掉括号,计算式子结果.

1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2017/4/30 7:44# @Author  : Olivia Su# @File    : 作业.py# @Software: PyCharmimport redef deal_negative_issue(calc_list):    new_calc_list=[]    #定义一个新的空列表,后面筛选完成后将数据放入新列表中    for index,item in enumerate(calc_list):        if item.strip().endswith("*") or item.strip().endswith("/"):    #挑选出以乘号或除号结尾的字符串            new_calc_list.append("%s-%s"%(calc_list[index],calc_list[index+1])) #拼接字符串 处理类似2*5/-3        # elif ("*" or "/") in item:  #找出列表中的有乘除的选项,这种写法我试了好像只匹配*在,单独40/5这种匹配不出来        elif ("/") in item or ("*") in item:            print(item)            new_calc_list.append(item)

print("new_calc_ist",new_calc_list)    return new_calc_list

def deal_unusual_issue(formula):    formula = formula.replace("++","+")    formula = formula.replace("+-", "-")    formula = formula.replace("-+", "-")    formula = formula.replace("--", "+")    formula = formula.replace("- -", "+")    return formula

def addition_and_subtraction(formula):    sub_calc_list = re.split("[+-]",formula)    sub_operator_list = re.findall("[+-]",formula)    print(type(sub_calc_list), sub_operator_list)    totle_res = None    for index,i in enumerate(sub_calc_list):        if totle_res: #sub_res为真,表示这不是第一次循环            if sub_operator_list[index-1]=="+":     #通过sub_operator_list中的index判断到底是加法还是减法                    totle_res += float(i)            else:                    totle_res -= float(i)        else:            sub_res = float(i)    print(totle_res)

def calculating(formula):    print("运算",formula)    calc_list = re.split("[+-]",formula)    #通过+-符号将各个乘除运算分隔出来    calc_list = deal_negative_issue(calc_list)    print(calc_list)    for item in calc_list:        sub_calc_list = re.split("[*/]",item)        sub_operator_list = re.findall("[*/]",item)     #将乘号除号通过列表方式分隔出来        print(sub_calc_list,sub_operator_list)        sub_res = None        for index,i in enumerate(sub_calc_list):            if sub_res: #sub_res为真,表示这不是第一次循环                if sub_operator_list[index-1]=="*":     #通过sub_operator_list中的index判断到底是加法还是减法,                    sub_res *= float(i)                else:                    sub_res /= float(i)            else:                sub_res = float(i)

print("[%s]="%item,sub_res)        formula = formula.replace(item,str(sub_res))        formula = deal_unusual_issue(formula)        print(formula)

#计算+-法totle_calc_list = re.split("[+-]", formula)totle_operator_list = re.findall("[+-]", formula)  # 将乘号除号通过列表方式分隔出来print(totle_calc_list, totle_operator_list)totle_res = Nonefor index,item in enumerate(totle_calc_list):    if totle_res: #sub_res为真,表示这不是第一次循环        if totle_operator_list[index-1]=="+":     #通过sub_operator_list中的index判断到底是加法还是减法,                totle_res += float(item)        else:                totle_res -= float(item)    else:        totle_res = float(item)        # return formulaprint("[结果]=", totle_res)    return totle_res

def calc(formula):    parentheses_flag = True    calc_res = Nonewhile parentheses_flag:    m = re.search("\([^()]*\)",formula)  #找出最底层的括号,一个一个找    print(m)    if m:        # print(type(m.group()))        subformula = m.group().strip("()")  #把找出来的括号剥离        subres = calculating(subformula)        formula = formula.replace(m.group(),str(subres))    else:        print("没括号了")        print("最终结果为",calculating(formula))        parentheses_flag = False

if __name__ =="__main__":    res = calc("1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )")
    

时间: 2024-08-03 21:14:53

五一放假作业4.30 用正则表达式写一个计算器!去掉括号,计算式子结果!的相关文章

利用面向对象写一个计算器

本文参考了程杰的<大话设计模式>,使用C#语言利用面向对象的模式来写一个计算器. 如果是我本人来写计算器,也就加减乘除的话,估计我会全部写进控制台里面,写4个if语句出来......或者我会利用switch,但是这样的效果都不好,有更好的方法,就是如下所示的代码啦: 先定义一个Operation类,主要实现运算框架: class Operation { public double Number1 { get; set;} public double Number2 { get; set; }

如何写一个计算器

考虑这样一个问题,给定一个字符串,"1+1+(3+4)-2*3+8/2",如何将它转化为如下形式, "1+1=2" "3+4=7" "2+7=9" "2*3=6" "9-6=3" "8/2=4" "3+4=7" 换句话说,就是如何将字符串按照四则运算计算出来,如何写一个计算器.拿java来举例,并且为了简单,我们只考虑个位数.这个过程大概分为这几个

用VBA写一个计算器

着急的 玩家 可以 跳过“============”部分 ======================================可以跳过的 部分   开始====================================================== 之所以 要有今天这样一篇博客是因为. 之前领导让找几组数据.从excel表格里面. 要求是 主号码 一致,副号码 一致,名称为 XXX 的 项目发生变化的数据 需要被找到. 这样的 项目 有 11个. 我找的真的是眼要花. 变动前

用PHP写一个计算器

本篇文章介绍了使用PHP+HTML+Javascript技术编写一个计算器的方法,希望对各位学习PHP开发的同学有帮助! 用PHP写一个计算器 <body> <?php if (!empty($_POST)) { $op=$_POST['point']; $sum1 = $_POST['sum1']; $sum2 = $_POST['sum2']; $sum = 0; if ($sum1 != '' && is_numeric($sum1) && $sum

今天学习了在一般处理程序中写一个计算器

今天看了看前面的javascript以及学习的jquery,感觉刚开始学习时间就赶得比较紧,练习是做啦,基础的知识都是知道的,但是在写一些小小的程序时间还是陌生,感觉练习的还是很不够的,其实怎么说那,想好好的学习还是把他们使用到项目中练习就会学习的更快些吧,然后我又做啦一个增删改查的一般处理程序,但是还没有总结好,现在就简单的先总结一个小小的计算器使用html和ashx来实现一下其功能,如下所示: 一.html样式 <script> //@Script; </script> <

1.自己写一个计算器demo

知识点: 1.System.Math.Pow() 实现乘方 2.实现计算器的运算优先级,依次调用的流程 问题: 还未实现“()”功能 解决方案 UI: 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Text; 7 using System.Windows.Fo

用JS写一个计算器(兼容手机端)

先看成果:1.PC端2. 首先确立html,有哪些东西我们要知道.布局大概的样子在心里有个数 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>瑞雪的计算器</t

用JS写一个计算器

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

PyQt5 写一个计算器框架

import sys from PyQt5.QtWidgets import QWidget, QLabel, QApplication, QPushButton, QHBoxLayout, QVBoxLayout, QGridLayout class Example(QWidget): def __init__(self): super().__init__() self.initUI() #---------------------------------------------------