正则表达式实现计算器

计算器:实现带括号的+ - * /运算需求分析:    8*5-2+(10-(8*5+6)/10+5)*(3-2)+8*(9-4)    1、从前到后找,找到第一个以(开始)结尾,中间不含有括号的表达式    2、正则表达式:\(^()\)定义两个函数:    1、def 处理加减乘除(表达式):                return 结果    2、def 处理括号(表达式):            while True:                #先找到第一个,分割成三部分,得到括号内的表达式,不要括号                re.split(‘\( [^()] \)‘,表达式,1)                #8*5-2+(10-  8*5+6  /10+5)*(3-2)+8*(9-4)                ret = 加减乘除(8*5+6)                #再把表达式连起来                8*5-2+(10-  ret  /10+5)*(3-2)+8*(9-4)
import re
import sys
def no_bracket_rules(expression):
    ‘‘‘计算没有括号的乘除运算‘‘‘
    md_check = re.search(r‘\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*‘,expression)
    if md_check:#乘除存在
        #得到第一个*或/运算表达式
        data = md_check.group()
        if len(data.split("*")) > 1:# 当可以用乘号分割,证明有乘法运算
            part1, part2 = data.split("*") # 用乘号分割
            result = float(part1)*float(part2)
        else:
            part1, part2 = data.split("/")# 用除号分割
            if part2 == 0:
                sys.exit("计算过程中有被除数为0的存在,计算表达式失败!")
            else:
                result = float(part1) / float(part2)
        # 获取第一个匹配到的乘除计算结果value,将value放回原表达式
        # 以第一个*或/分割表达式
        s1, s2 = re.split(‘\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*‘, expression, 1)
        # 将计算结果和剩下的表达式组合成新的字符串
        new_exp = "%s%s%s" % (s1, result, s2)
        return no_bracket_rules(new_exp)#递归表达式
    else:#乘除不存在,在判断加减是否存在
        expression = expression.replace(‘+-‘, ‘-‘)  # 替换表达式里的所有‘+-‘
        expression = expression.replace(‘--‘, ‘+‘)  # 替换表达式里的所有‘--‘
        expression = expression.replace(‘-+‘, ‘-‘)  # 替换表达式里的所有‘-+‘
        expression = expression.replace(‘++‘, ‘+‘)  # 替换表达式里的所有‘++‘
        as_check = re.search(‘\d+\.*\d*[\+\-]{1}\d+\.*\d*‘, expression)#匹配加减号
        if not as_check:   # 如果不存在加减号,则证明表达式已计算完成,返回最终结果
            return expression
        else:
            #得到第一个+或-运算表达式
            data = re.search(‘[\-]?\d+\.*\d*[\+\-]{1}\d+\.*\d*‘, expression).group()
            if len(data.split("+")) > 1: #以加号分割成功,有加法计算
                part1, part2 = data.split(‘+‘)
                value = float(part1) + float(part2)  # 计算加法
            elif data.startswith(‘-‘):  # 如果是以‘-‘开头则需要单独计算,因为是负数
                #分割为三部分,分别为‘‘,正数,正数
                part1, part2, part3 = data.split(‘-‘)
                value = -float(part2) - float(part3)  # 计算以负数开头的减法
            else:  #正数的减法运算
                part1, part2 = data.split(‘-‘)
                value = float(part1) - float(part2)  # 计算减法
            # 以第一个+或-分割表达式
            s1, s2 = re.split(‘[\-]?\d+\.*\d*[\+\-]{1}\d+\.*\d*‘, expression, 1)
            # 将计算后的结果替换回表达式,生成下一个表达式
            new_exp = "%s%s%s" % (s1, value, s2)
            return no_bracket_rules(new_exp)  # 递归运算表达式

# s = "8*5-2+10.4+6*1+8*9-4"
# ret = no_bracket_rules(s)
# print(ret,type(ret))#122.4 <class ‘str‘>

def bracket_rules(expression):
    ‘‘‘计算括号内的表达式‘‘‘
    while True:
        #验证表达式内是否含有以括号开始和结尾,且中间不含括号的
        if re.findall(r"\(([^()]+)\)",expression):
            # 找到第一个以(开始,以)结尾,且中间不含()的表达式
            s_split = re.split(r"\(([^()]+)\)",expression,1)
            ret = no_bracket_rules(s_split[1])#分割为三部分,中间为得到的表达式
            # 将先前得到的表达式的计算结果和剩下的表达式组合成新的字符串
            new_exp = "%s%s%s" % (s_split[0], ret, s_split[2])
            return bracket_rules(new_exp)#返回函数,继续查找表达式
        else:
            #如果表达式内没有括号,就直接调用加减乘除函数进行计算
            result = no_bracket_rules(expression)
            return result

s = "8*5-2+(10-(8*5+6)/10+5)+6*(3-2)+8*9-4"
ret = bracket_rules(s)
print(ret)#122.4
 

原文地址:https://www.cnblogs.com/charliedaifu/p/10090201.html

时间: 2024-08-10 04:51:33

正则表达式实现计算器的相关文章

Python基础篇【第十一篇】:正则表达式之计算器

1.首先写运算式的正则表达式(加减,乘除,乘负数,除负数,匹配括号最里层) l1_expression = re.compile(r'(-?\d+)(\.\d+)?[-+](-?\d+)(\.\d+)?') #匹配加减的正则表达式 l2_expression = re.compile(r'(-?\d+)(\.\d+)?[/*](-?\d+)(\.\d+)?') #匹配乘除的正则表达式 l3_expression = re.compile(r'(-?\d+)(\.\d+)?\*-(-?\d+)(\

python--------re 正则表达式(计算器)

re是一门小型语言 元字符 .      通配符除了\n ^     以什么开始的匹配 $     以什么结尾的匹配 *     重复前一个条件,最少0个,[0,∞] +     重复前一个条件,最少1个,[1,∞] ?   重复前面的条件,最少0个,最多1个[0,1] {x}  重复前面的x次,x为数字,{x,y}最少x次,最多y-1次,{x,}最少x次,最多不限 |     或的意思 \ 反斜杠后跟元字符去除特殊功能 \. 就是匹配点. \+ 匹配+ \\\\ 匹配\ 等于 r"\\&quo

【Python】使用正则表达式实现计算器练习

已知有以下这样一个不太友好的公式: 1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) 我们使用正则表达式的基础来练习,将此结果计算出来. 代码如下: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import re 5 import functool

python模块练习二—使用正则表达式实现计算器的功能

开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后, 必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果, 结果必须与真实的计算器所得出的结果一致

[ Python - 6 ] 正则表达式实现计算器功能

要求:禁止使用eval函数.参考网上代码如下: #!_*_coding:utf-8_*_ """用户输入计算表达式,显示计算结果""" import re a = '2+(6/3-2+(1*4))' # 取最内层的括号 bracket = re.compile('\([^()]+\)') # 加法 add = re.compile('(-?\d+\.?\d*\+\d+\.?\d*)|(-?\d+\.?\d*\+-\d+\.?\d*)') # 减法

用正则表达式实现 计算器

#!/usr/bin/env python # coding:utf-8 import re def dealwith(express): express.replace('+-','-') express.replace('--','+') return express def col_suanshu(exp): if '/' in exp: a,b = exp.split('/') return str(float(a)/float(b)) if '*' in exp: a,b = exp.

老男孩Python高级全栈开发工程师【真正的全套完整无加密】

课程大纲 老男孩python全栈,Python 全栈,Python教程,Django教程,Python爬虫, scrapy教程,python高级全栈开发工程师,本套教程,4部分完整无缺,课程完结,官方售价6800元. 课程全部都是不加密,全部都有声音-不是网上那种几块钱十几块钱那种加密没有声音或者课程不全,贪便宜花冤枉钱不说都会严重影响学习,耽误大量时间! 本套全栈课程,不说完全媲美线下教学,只要你肯坚持,不会比面授差太多-坚持学完找一份python开发类的工作完全没问题,另外对于学习方面的投资

目录--知识详解

python(1)-   初识python python(2)-   python程序的编写简单介绍 python(3)-   循环语句:从最内层跳出多层循环 python(4)-   简单练习:python实现购物车的优化 python(5)-   简单练习:python三级菜单优化 python(6)-   常用快捷键及基础命令 python(7)-   小程序练习:循环语句for,while实现99乘法表 python(8)-   基础数据类型 python(9)-   基础知识刷题 py

正则表达式-计算器

利用正则表达式计算下面值: 1 - 2 * ( (60 - 30 + (-40.0/5) * (9 - 2 * 5/3 + 7 / 3 * 10/4*2 +10 *5/14)) -(-4*3)/(16-3*2)) import re def wipe(s): #定义去除重复+-号函数 res=s.replace("+-","-").replace("++","+").replace("--","+