正则表达式应用:实现一个简单的计算器

实现一个简单的计算器,代码如下:

下面的函数用来检验数学表达式的合规性,当然此处只实现两个检验:(1)括号应该闭合 (2)不能出现字母

def check_expression(str):
    check_result = True
    if str.count('(') != str.count(')'):
        print('表达式有误:括号未闭合!请重新输入')
        check_result = False
    elif re.findall('[a-z]',str.lower()):
        print('表达式含有非法字符!请重新输入')
        check_result = False
    return check_result
下面的函数用来将表达式格式化:此处实现以下几个功能
def format_expression(str):
    str = str.replace('--','+')
    str = str.replace('+-','-')
    str = str.replace(' ', '')      #用空字符代替空格
    return str
计算乘除的函数
def calc_mul_div(str1):
    mul_div_exp = '\d+\.?\d*[*/]-?\d+\.?\d*'               #匹配一个带/*的表达式
    while re.findall(mul_div_exp,str1) != []:              #当能找到这样的表达式时,进行以下计算
        search_exp=re.search(mul_div_exp,str1).group()     #先匹配一个
        if search_exp.count('*') == 1:                     #如果表达式中带的是*
            x,y = search_exp.split('*')                    #则用*分割
            mul_result = str(float(x) * float(y))          #进行计算
            str1 = str1.replace(search_exp,mul_result)     #用计算结果代替匹配的表达式
            str1 = format_expression(str1)                 #再次格式化
        else:                                              #如果表达式中带的是不是*,那就必然是/
            x, y = search_exp.split('/')
            div_result = str(float(x) / float(y))
            str1 = str1.replace(search_exp, div_result)
            str1 = format_expression(str1)
    return str1
计算加减的函数
 
 1 def calc_add_sub(str1):
 2     add_sub_exp = '-?\d+\.?\d*[+-]-?\d+\.?\d*'
 3     while re.findall(add_sub_exp,str1) != []:
 4         search_exp = re.search(add_sub_exp,str1).group()
 5         if search_exp.count('+') == 1:
 6             x,y = search_exp.split('+')
 7             add_result = str(float(x) + float(y))
 8             str1 = str1.replace(search_exp,add_result)
 9             str1 = format_expression(str1)
10         else:
11             num = search_exp.split('-')
12             if len(num) == 3:        #像-3-5这样的式子,用减号会分割出三个元素,所以要进行判断
13                 sub_result = 0
14                 for i in num:
15                     if i != '':
16                         sub_result -= float(i)
17             else:
18                 x,y = search_exp.split('-')
19                 sub_result = float(x) - float(y)
20             sub_result = str(sub_result)
21             str1 = str1.replace(search_exp,sub_result)
22             str1 = format_expression(str1)
23     return str1
 
下面是计算器工作流程
 
 1 while True:
 2     exp = input('请输入表达式:')
 3     if check_expression(exp) == True:    #检验表达式
 4          format_expression(exp)         #将表达式格式化
 5          while exp.count('(') >0:      #当有括号时,先找到最里层括号,再计算
 6             inner_exp = re.search('\([^()]+\)',exp).group()    #匹配最里层括号的表达式
 7             mul_div_ret = calc_mul_div(inner_exp)           #先算乘除
 8             add_sub_ret = calc_add_sub(mul_div_ret)           #再算加减
 9             exp = format_expression(exp.replace(inner_exp,add_sub_ret[1:-1]))
10          else:                        #当没有括号时,直接计算
11              mul_div_ret = calc_mul_div(exp)  # 先算乘除
12              add_sub_ret = calc_add_sub(mul_div_ret)  # 再算加减
13              calc_ret = exp.replace(exp,add_sub_ret)
14              print('The result is:',calc_ret)
15     else:                             #如果没有通过检验,让用户重新输入
16         continue
 

 
 
 

猜你喜欢

转载自www.cnblogs.com/Finance-IT-gao/p/10452665.html
今日推荐