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


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

    下面的函数用来检验数学表达式的合规性,当然此处只实现两个检验:(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
    
    
    
     
     
     
  • 相关阅读:
    zjnu1725 COCI (类似二维树状数组模拟)
    zjnu1730 PIRAMIDA(字符串,模拟)
    hdu5365Shortest Path (floyd)
    表达式的转换 (模拟题)
    zjnu1709 UZASTOPNI (bitset,树形dp)
    zjnu1707 TOPOVI (map+模拟)
    zjnu1716 NEKAMELEONI (线段树)
    zjnuSAVEZ (字符串hash)
    codeforces 55D. Beautiful numbers (数位dp)
    TP5将入口文件放在Public中,能得到那些安全保障?
  • 原文地址:https://www.cnblogs.com/Finance-IT-gao/p/10452665.html
Copyright © 2020-2023  润新知