利用re模块编写计算器

Posted on 2018-03-27 20:24  甜心卜乙  阅读(400)  评论(0)    收藏  举报
# -*- coding: UTF-8 -*-
# Author: hanly

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))'

#去掉括号以后变换运算符号
def sign_change():
    global user_input
    user_input = user_input.replace('+-','-')
    user_input = user_input.replace('-+', '-')
    user_input = user_input.replace('--', '+')
    user_input = user_input.replace('++', '+')
    user_input = user_input.replace('+/', '/')
    user_input = user_input.replace('/+', '/')
    user_input = user_input.replace('*+', '/')
    user_input = user_input.replace('+*', '/')
    #*-替换为*存在问题
    user_input = user_input.replace('*-', '*')


#匹配最内部的括号
def search_func(user_input):
    user_search = re.search(r'\([^()]+\)',user_input)
    if user_search:
        user_search = user_search.group()
       # user_search = user_search[1:-1]
    return user_search

#乘除法运算
def multipli(inner_con):
    while re.search(r'\*|\/',inner_con):
        res_multi = re.search("\d+\.?\d*[\/\*]{1}\d+\.?\d*",inner_con)
        if res_multi:
            multi_res = res_multi.group()
            if '*' in multi_res:
                numbers = multi_res.split('*')
                res = int(numbers[0])*int(numbers[1])
            else:
                numbers = multi_res.split('/')
                res = int(numbers[0]) / int(numbers[1])
            inner_con = inner_con.replace(multi_res, str(res))
            print inner_con

    if re.match(r'^\-', inner_con[1:-1]):
        tem = 0
    else:
        tem = 1
    if tem == 1 and re.search(r'\+|\-',inner_con):
        return plus(inner_con[1:-1])
    elif '(' in inner_con:
        return inner_con[1:-1]
    else:
        return inner_con


#加减法运算
def plus(user_input):
    while re.search(r'\+|\-',user_input):
        re_plus = re.search(r'.?\d+[\-\+]{1}\.?\d+', user_input)
        if re_plus:
            re_plus = re_plus.group()
            if '+' in re_plus:
                re_list = re_plus.split('+')
                if re.match(r'^\-',re_plus):
                    re_list = -int(re_list[0])+int(re_list[1])
                else:
                    re_list = int(re_list[0])+int(re_list[1])
            else:
                re_list = re_plus.split('-')
                sub_list = re.findall(r'\-',re_plus)
                if len(sub_list) == 2:
                    re_list = -int(re_list[1]) - int(re_list[2])
                elif re.match(r'^\-',re_plus):
                    re_list = -int(re_list[0])+int(re_list[1])
                else:
                    re_list = int(re_list[0]) - int(re_list[1])
            user_input = user_input.replace(re_plus,str(re_list))
        else:
            return user_input
    return user_input




if __name__ == '__main__':
    global user_input
    #user_input = raw_input('请输入计算公式:')
    user_input = s
    while search_func(user_input):
        # 查找公式最内部的括号
        inner_con = search_func(user_input)
        if inner_con:
            sign_change()
            print inner_con
            mul_res = multipli(inner_con)
            user_input = user_input.replace(inner_con,mul_res)
            print user_input

    sign_change()
    inner_con = search_func(user_input)
    user_input = multipli(user_input)
    result = plus(user_input)
    print '结果为:',result

代码中运算符变换处待修改