python学习笔记 day19 作业讲解-使用正则表达式实现计算器

1. 实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序

import re
s='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
s=s.split()
s=''.join(s)
print(s)
ret=re.findall('((?:[+-]?d+(?:[+-*/]d+)+))',s)   #提取最里面的括号
print(ret)
for i in ret:
    i=re.search('-?d+(?:[+-*/]d+)+',i)     #提取到的带括号的表达式去除掉括号,只剩下表达式
    i=i.group()
    while re.search('d+[*/]d+',i):
        expression=re.search('(d+)([*/])(d+)', i)
        num_1=expression.group(1)
        sign=expression.group(2)
        num_2=expression.group(3)
        if sign=='/':
            result=int(num_1)/int(num_2)
        else:
            result = int(num_1) * int(num_2)
        i=re.sub('(d+)([*/])(d+)',str(result), i)
        print(i)
    while re.search('d+[+-]d+',i):
        expression = re.search('(d+)([+-])(d+)', i)
        num_1 = expression.group(1)
        sign = expression.group(2)
        num_2 = expression.group(3)
        if sign == '+':
            result = int(num_1) + int(num_2)
        else:
            result = int(num_1) - int(num_2)
        i = re.sub('(d+)([+-])(d+)', str(result), i)
        print(i)

还没写好,但是我有思路了,就是 不断循环,先匹配括号,然后提取括号中的表达式,然后对这个表达式从左往右遍历,匹配*/,先计算乘除,将计算的结果代替原来匹配的正则规则,就是用计算出来的结果代替表达式,然后乘除匹配完之后匹配加减,一直算 然后括号算完 就是循环结束之后 ,就只剩下普通的计算了 和原来思路一样,明天应该能写出来,,,,

 我!终于!写出来了!!!

#_+_coding:utf-8_*_
#author:    xuanxuan
#Time :     2018/9/13  12:43

import re
s='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/2 + 9 /3*2/2*2 +10 * 2/4 )) - (-4*3)/ (16-5*2) )'
s=s.split()   # 按照空格分割,组成一个列表 str--->list
s=''.join(s)  # 将list-->str ,去除字符串的空格
print('原始表达式:',s)
while re.search('(-?d+(?:.d+)?(?:[+-*/]-?d+(?:.d+)?)+)',s):   #看这个表达式中存不存在括号  #(-?d+(?:[+-*/]-?d+)+)
    inner_expression = re.search('(-?d+(?:.d+)?(?:[+-*/]-?d+(?:.d+)?)+)',s).group()    # 原来的表达式中 最里层括号内的表达式
    expression=re.search('-?d+(?:.d+)?(?:[+-*/]-?d+(?:.d+)?)+',inner_expression).group()   # 把最内层括号中的表达式取出来

    while re.search('[*/]',expression):
        sign=re.search('[*/]',expression).group()
        if sign=='*':
            num_1=re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)',expression).group(1)
            num_2=re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)',expression).group(2)
            result=float(num_1) * float(num_2)
            expression=re.sub('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)',str(result),expression,1)
        elif sign=='/':
            num_1 = re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)', expression).group(1)
            num_2 = re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)', expression).group(2)
            result = float(num_1) / float(num_2)
            expression = re.sub('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)', str(result), expression,1)

    while re.search('-?d+(?:.d+)?([+-])',expression):
        sign = re.search('(-?d+(?:.d+)?)([+-])', expression).group(2)
        if sign=='+':
            num_1=re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)',expression).group(1)
            num_2=re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)',expression).group(2)
            result=float(num_1) + float(num_2)
            expression=re.sub('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)',str(result),expression,1)
        elif sign=='-':
            num_1 = re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)', expression).group(1)
            num_2 = re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)', expression).group(2)
            result = float(num_1) - float(num_2)
            expression = re.sub('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)', str(result), expression,1)
    s = re.sub('(-?d+(?:.d+)?(?:[+-*/]-?d+(?:.d+)?)+)', expression, s,1)

while re.search('[*/]',s):
    sign=re.search('[*/]',s).group()
    if sign=='*':
        num_1=re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)',s).group(1)
        num_2=re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)',s).group(2)
        result=float(num_1)*float(num_2)
        s=re.sub('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)','+'+str(result),s,1)
    else:
        num_1 = re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)', s).group(1)
        num_2 = re.search('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)', s).group(2)
        result = float(num_1) / float(num_2)
        s = re.sub('(-?d+(?:.d+)?)[*/](-?d+(?:.d+)?)', '+'+str(result), s, 1)
while re.search('[+-]',s):
    sign=re.search('[+-]',s).group()
    if sign=='+':
        num_1=re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)',s).group(1)
        num_2=re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)',s).group(2)
        result=float(num_1)+float(num_2)
        s=re.sub('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)',str(result),s,1)
    else:
        num_1 = re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)', s).group(1)
        num_2 = re.search('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)', s).group(2)
        result = float(num_1) - float(num_2)
        s = re.sub('(-?d+(?:.d+)?)[+-](-?d+(?:.d+)?)', str(result), s, 1)
print(s)

运行结果:

talk is cheap,show me the code
原文地址:https://www.cnblogs.com/xuanxuanlove/p/9637885.html