博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式应用:实现一个简单的计算器
阅读量:5951 次
发布时间:2019-06-19

本文共 3293 字,大约阅读时间需要 10 分钟。

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

下面的函数用来检验数学表达式的合规性,当然此处只实现两个检验:(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 = 014                 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
 

 

 
 
 

转载于:https://www.cnblogs.com/Finance-IT-gao/p/10452665.html

你可能感兴趣的文章
“10%时间”:优点和缺点——敏捷海滩会议上Elizabeth Pope的报告
查看>>
关于“Fluent UI”或Ribbon Design报道的补充说明
查看>>
2018年终盘点:“年度爆款”的区块链真的结束了吗?
查看>>
51信用卡 Android自动埋点实践
查看>>
敏捷现状10周年调查
查看>>
PHP Session可能会引起并发问题
查看>>
AI产品开发的核心原则:以研究为核心驱动
查看>>
大规模集群中Docker镜像如何分发管理?试试Uber刚开源的Kraken
查看>>
WinDocks发布Windows版本的Docker引擎
查看>>
完美解决html中select的option不能隐藏的问题。
查看>>
推荐5大开源工具,用于开发Kubernetes项目
查看>>
制定2015年的移动开发策略
查看>>
JPA 2.2改进了易用性
查看>>
从蚂蚁金服实践入手,带你深入了解 Service Mesh
查看>>
24周年,“常青树”Delphi发布新版本10.3.1
查看>>
7. 从数据库获取数据- 从零开始学Laravel
查看>>
阿里百川码力APP监控 来了!
查看>>
使用dotenv管理环境变量
查看>>
温故js系列(11)-BOM
查看>>
Vuex学习
查看>>