正则表达式计算器 python3

描述:
利用正则表达式辨别并提取表达式内加减乘除运算并计算结果
代码如下:

# -*- coding:utf-8 -*-
import re

mul = re.compile(r'(\d+\.?\d*\*-?\d+\.?\d*)')  # 创建寻找乘法对象
div = re.compile(r'(\d+\.?\d*/-?\d+\.?\d*)')  # 创建寻找除法对象
add = re.compile(r'(-?\d+\.?\d*\+-?\d+\.?\d*)')  # 创建寻找加法对象
sub = re.compile(r'(-?\d+\.?\d*-\d+\.?\d*)')  # 创建寻找除法对象
find_bracket = re.compile(r'\([^()]+\)')  # 创建寻找最内层括号对象
drop_bracket = re.compile(r'[^(].*[^)]')  # 创建提取括号内内容对象
check_cal = re.compile(r'\(?\+?-?\d+\)?')  # 创建检查是否还有其他运算对象

def Mul(s):
    '''提取乘法运算后替换原有表达式'''
    m = mul.search(s).group()
    n = re.split('\*', m)
    return s.replace(m, str(float(n[0]) * float(n[1])))

def Div(s):
    '''提取除法运算后替换原有表达式'''
    m = div.search(s).group()
    n = re.split('/', m)
    return s.replace(m, str(float(n[0]) / float(n[1])))

def Add(s):
    '''提取加法运算后替换原有表达式'''
    m = add.search(s).group()
    n = re.split('\+', m)
    return s.replace(m, str(float(n[0]) + float(n[1])))

def Sub(s):
    '''提取减法运算后替换原有表达式'''
    m = sub.search(s).group()
    n = re.split('-', m)
    if re.match('-', m):
        '''如果开头为‘-’,re.split()函数会把表达式分成['', 'dig', 'dig'],所以要处理n[1]和n[2]'''
        return s.replace(m, str(- float(n[1]) - float(n[2])))
    else:
        return s.replace(m, str(float(n[0]) - float(n[1])))

def  Sta_exp(s):
    '''标准化表达式'''
    s = s.replace(" ", "")
    s = str('(%s)' % s)
    return s

def Calculate(s):
    '''
    计算流程:
    若果有最内层括号存在,先把可能存在的--替换为+
    然后计算最内层括号内运算,并在无运算后去除括号
    优先级:除>乘>减>加>括号判断  返回float型结果
    '''
    while find_bracket.search(s):
        s = s.replace("--", "+")
        exp = find_bracket.search(s).group()
        if div.search(exp): s = s.replace(exp, Div(exp))
        elif mul.search(exp): s = s.replace(exp, Mul(exp))
        elif sub.search(exp): s = s.replace(exp, Sub(exp))
        elif add.search(exp): s = s.replace(exp, Add(exp))
        elif check_cal.search(exp): s = s.replace(exp, drop_bracket.search(exp).group())
    return float(s)

def run():
    while True:
        exp = input("输入一个正确的表达式或按q退出:\n")
        if exp == 'q':
            break
        else:
            exp = Sta_exp(exp)
            print("eval函数计算结果:", eval(exp))
            print("Calc函数计算结果:", Calculate(exp))

if __name__ == '__main__':
    run()

测试结果:
示例1

(2+1)(2+3)+2*6
eval函数计算结果: 27
Calc函数计算结果: 27.0

示例2:

1 - 2 * ( (60-30 +(-40/5) * (9-25/3 + 7 /399/42998 +10 * 568/14 )) - (-43)/ (16-3*2) )
eval函数计算结果: 2776672.6952380957
Calc函数计算结果: 2776672.6952380957

你可能感兴趣的:(python学习)