• 计算器——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))
    

      

      

  • 相关阅读:
    Django(28)Django模板介绍
    Django(27)Django类视图添加装饰器
    HTTP协议-返回结果的HTTP状态
    HTTP协议二
    HTTP协议 一
    HTTP 协议用于客户端和服务器端之间 的通信
    Net分布式系统之一:系统整体框架介绍
    数据结构-实现正负数重新排序
    数据结构-合并两个已经排序的数组
    数据结构-查找第一个没有重复的数组元素
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8759019.html
Copyright © 2020-2023  润新知