【练习】正则表达式计算器

#coding:utf-8
import re

#正则表达式计算器
#检测错误(1)括号匹配(2)运算符检查 (3)非法字符
#查找括号,乘除,加减。
#运算
#主函数替换


# ret=re.findall('\([^()]+\)',s)
# 审核小括号
def check_k(s):
    tag = 0
    for x in s:
        if x == '(':
            tag += 1
        elif x == ')':
            tag -= 1
            if tag < 0:
                break
    if tag == 0:
        return 1
    else:
        raise Exception('算式错误')
#运算符检查
def check_f(s):
    s=s.replace('++','+')
    s=s.replace('--', '+')
    s = s.replace('+-', '-')
    s=s.replace('-+','+')
    return s

def count(s_sub):
    # 处理乘除,直到没有乘除号,注意负号和小数点
    ret=re.search('(-?\d+\.?\d*)([*/])(-?\d+\.?\d*)', s_sub)
    #直至内部无乘除运算后停止
    while ret!=None:
        num_1 = ret.group(1)
        sign = ret.group(2)
        num_2 = ret.group(3)
        if sign == '*':
            num = float(num_1) * float(num_2)
        if sign == '/':
            num = float(num_1) / float(num_2)
        num = str(num)
        s_sub = s_sub.replace(ret.group(), num)
        ret=re.search('(-?\d+\.?\d*)([*/])(-?\d+\.?\d*)', s_sub)
    #处理加减,直至内部无加减运算后停止
    ret=re.search('(-?\d+\.?\d*)([+-])(\d+\.?\d*)', s_sub)
    while ret!=None:
        num_1 = ret.group(1)
        sign = ret.group(2)
        num_2 = ret.group(3)
        if sign == '+':
            num = float(num_1)+float(num_2)
        if sign == '-':
            num = float(num_1)-float(num_2)
        num = str(num)
        s_sub = s_sub.replace(ret.group(), num)
        ret = re.search('(-?\d+\.?\d*)([+-])(\d+\.?\d*)', s_sub)
    return s_sub





s='1-2*((60-30+(-40/5)*(9-2*6/3+4*2998+10*568/2))-(-4*3)/(16-3*2))'
check_k(s)
#找到最内部括号
s_kuohao=re.findall('\([^()]+\)',s)
while s_kuohao!=[]:  #能匹配到内部括号继续循环
    for x in s_kuohao:
        #去括号
        s_sub=x[1:-1]
        #处理加减乘除,返回处理过的括号内容
        tihuan=count(s_sub)
        s=s.replace(x,tihuan)
        #处理负号冲突
        s=check_f(s)
    s_kuohao=re.findall('\([^()]+\)',s)
s=count(s)

print(s)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值