python学习13 re模块的应用之计算器的实现

计算器的实现:

#codeing:UTF-8
#__author__:Administrator
#date:2018/4/9/009 20:26
source_str = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
# source_str = "1 - 2 "
# source_str = "1 - 2 * ( 60-30 +(-40/5) )"
import re
def check_source(source):
    FLAG = True
    if not source.count("(") == source.count(")"):
        print("Invalid")
    if re.findall('[a-z]',source.lower()):
        print("Invalid")#有病的,
        FLAG = False
    return FLAG

def formate_source(source):
    source = source.replace(" ","")
    source = source.replace("++","+")
    source = source.replace("+-","-")
    source = source.replace("*+","*")
    source = source.replace("-+","-")
    source = source.replace("--","+")
    source = source.replace("/+","/")
    source = source.replace("//","/")
    return source

def cal_mul_div(source):
    regular = '[\-]?\d+\.?\d*[/*][\-]?\d+\.?\d*'
    while re.search(regular,source):
        expression = re.search(regular,source).group()
        if expression.count("*")==1:
            x, y = expression.split("*")
            mul_result = "+"+str(float(x)*float(y))
            source = source.replace(expression,mul_result)
            source = formate_source(source)

        if expression.count("/")==1:
            x, y = expression.split("/")
            mul_result = "+"+str(float(x)/float(y))
            source = source.replace(expression,mul_result)
            source = formate_source(source)
    # print(source)
    return source

def cal_add_sub(source):
    add_regular = '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'
    sub_regular = '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'
    # print(re.findall(add_regular,source))#########
    while re.findall(add_regular,source):#+
        add_list = re.findall(add_regular,source)
        # print(add_list)
        for add_str in add_list:
            x,y = add_str.split("+")
            mul_result = "+"+str(float(x) + float(y))
            source = source.replace(add_str, mul_result)
        source = formate_source(source)

    while re.findall(sub_regular,source):#-
        sub_list = re.findall(sub_regular,source)
        for sub_str in sub_list:
            x,y = sub_str.split("-")
            mul_result = "+"+str(float(x) - float(y))
            source = source.replace(sub_str, mul_result)
        source = formate_source(source)
    return source

if check_source(source_str):
    print("source:",source_str)
    print("eval result:",eval(source_str))
    source = formate_source(source_str)
    print("formate source:",source)
    while re.search("\(",source):
        deal_str = re.search("\([^()]+\)",source).group()
        # print(deal_str)#
        replace_str = cal_mul_div(deal_str)
        # print(replace_str)#
        replace_str = cal_add_sub(replace_str)####
        # print(replace_str[1:-1])
        source = formate_source(source.replace(deal_str,replace_str[1:-1]))
        # print(source)
    else:
        replace_str = cal_mul_div(source)
        replace_str = cal_add_sub(replace_str)
        # print(replace_str[1:-1])
        source = formate_source(source.replace(source, replace_str[1:-1]))
    print("my result :",source)

  测试结果:

posted @ 2018-04-11 18:49  Duke777  阅读(278)  评论(0编辑  收藏  举报