python(32)- 模块练习Ⅱ:使用正则表达式实现计算器的功能

开发一个简单的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等类似功能偷懒实现),运算后得出结果,

结果必须与真实的计算器所得出的结果一致

import re
def func(a):
    while True:
        if '*' in a:
            c = a.split('*')
            if '/' in c[0]:
                a = div(a)
            else:
                a = mul(a)
        elif '/' in a:
            a = div(a)
        else:
            a = add(a)
            return a
def mul(a):
    b = re.search(r'\d+\.?\d*\*-?\d+\.?\d*', a)
    if b:
        b = b.group()
        l=b.split("*")
        c=float(l[0])*float(l[1])
        res = re.sub(r'\d+\.?\d*\*-?\d+\.?\d*', str(c), a,1)
        return res
def div(a):
    b = re.search(r'\d+\.?\d*/-?\d+\.?\d*', a)
    if b:
        b = b.group()
        l=b.split("/")
        c=float(l[0])/float(l[1])
        res = re.sub(r'\d+\.?\d*/-?\d+\.?\d*', str(c), a,1)
        return res
def add(a):
    if '--' in a:
        a = a.replace('--', '+')
    b = re.findall(r'-?\d+\.?\d*', a) #把负数两个字符看成一个整体
    c=0
    for i in b:
        c+=float(i)
    return c
def caculate():
    a = ''.join(input('请输入计算公式如1-2*(60-30+(-40/5))等此类:').split())#把输入字符串以空格切片然后在拼接
    while True:
        if '(' in a:
            b = re.search(r'\(([^()]+)\)', a)
            if b:
                c = b.group()
                d = func(c)
                a = re.sub(r'\(([^()]+)\)', str(d), a, 1)    
        else:
            print(func(a))
            break
caculate()  

  

posted @ 2016-05-02 23:02  许二哈哈哈  阅读(398)  评论(0编辑  收藏  举报