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

  

  

原文地址:https://www.cnblogs.com/xingkongyihao/p/8759019.html