zoukankan      html  css  js  c++  java
  • 计算器——python正则表达式

    使用正则表达式

    1、实现加减乘除及拓号优先级解析
    2、用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致。

    用正则表达式计算这个的话分三步:

    1、搜索出最里层的()  比如上面这个表达式第一个是(-40/5)

    2、然后把()去掉,开始计算,先计算* / 

    3、最后计算 + - ,然后把计算的结果 - 8.0 代替之前的(-40/5)

    具体代码如下:

    #-*- coding:utf-8 -*-
    
    '''
    @auther: Starry
    @file: work.py
    @time: 2018/4/8 20:32
    '''
    
    import re
    '''
    开发一个简单的python计算器
    
    1、实现加减乘除及拓号优先级解析
    2、用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
    等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,
    结果必须与真实的计算器所得出的结果一致
    '''
    def mulAndDiv(s):
        '''
        没有括号,但有+ - * /  的表达式,只计算* / 运算符
        :param s: 有* 、/ 、+ 或 - 的表达式
        :return: 计算的结果
        '''
        while re.search(r'[*/]',s):
            ss = re.search(r'[d.]+[*/]-?[d.]+',s).group()
            if '*' in ss:
                result = str(float(ss[:ss.index('*')])*float(ss[ss.index('*')+1:]))
            else:
                result = str(float(ss[:ss.index('/')])/float(ss[ss.index('/')+1:]))
            s = s.replace(ss, result)
        return s
    def addAndSub(s):
        '''
        计算只有+ - 的表达式  有可能出现 '--',这就要将其两个都装换成+ 
        :param s: 只有+ - 的表达式
        :return: 计算的结果
        '''
        array = re.findall(r'([d.]+|-|+)', s)
        for i in range(len(array)-1):
            if array[i] == '-' and array[i+1] == '-':
                array[i] = array[i+1] = '+'
        for i in range(len(array)):
            if array[i] == '-':
                array[i] = '+'
                array[i+1] = str(float(array[i+1])*-1)
        sum = 0.0;
        for a in array:
            if a != '+':
                sum += float(a)
        return str(sum)
    def calculator(s):
        '''
        计算最里层的(),将结果替代之前的值。
        :param s: 要计算的表达式
        :return: 计算的答案
        '''
        while '(' in s:
            ss = re.search(r'([^()]+)',s).group()
            sss = addAndSub(mulAndDiv(ss[1:-1]))
            s = s.replace(ss,sss)
        return addAndSub(mulAndDiv(s));
    if __name__ == '__main__':
        ss = input().replace(' ','')
        # ss = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'.replace(' ','')
        try:
            print(calculator(ss))
        except:
            print("表达有错!")
        print(eval(ss))
    

      

      

  • 相关阅读:
    vm8.0安装mac提示中断导致虚拟cpu进入终止状态……vm重启的解决办法
    WPF和WindowsForm下的按下Enter跳转下一个控件通用方法
    【Z】oledb读写excel出现“操作必须使用一个可更新的查询”错误
    关于系统编码的那点事
    【Z】使用OleDbCommandBuilder时出现“Insert into 语句的语法错误”
    Thread 初学(二)——线程同步
    Oracle中针对一张表建立触发器,并且触发器也处理同一张表的数据(ora04091 错误)
    Thread初学 (一)
    【Z】使用SQL Server的OPENROWSET函数
    13个绚丽的Jquery 界面设计
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8759019.html
Copyright © 2011-2022 走看看