Python实例---利用正则实现计算器[FTL版]

 

import re
# 格式化
def format_str(str):
    str = str.replace('--', '+')
    str = str.replace('-+', '-')
    str = str.replace('+-', '-')
    str = str.replace('*+', '*')
    str = str.replace('/+', '/')
    str = str.replace('++', '+')
    str = str.replace(' ', '')

# 表达式检查
def check_exp(str):
    ret = True
    # 匹配括号
    if not str.count('(') == str.count(')'):
        print("表达式错误,括号未闭合")
        ret = False
    if re.findall('[a-z]+', str.lower()):
        print('表达式错误,非法字符!!!')
        ret = False
    return ret


# 计算乘除法 (30 + 6 * 2)
def cal_mul_div(str):
    # 取出第一个乘法或者除法的表达式
    regular = '\d+\.?\d*([*/]|\*\*)[\-]?\d+\.?\d*'
    while re.findall(regular, str):
        # 获取表达式
        expr = re.search(regular, str).group()
        # 计算乘法
        if expr.count('*') == 1:
            # 获取要计算的2个数字
            x, y = expr.split('*')
            # 计算乘法
            mul_result = str(float(x) * float(y))
            # 结果替换表达式
            str = str.replace(expr, mul_result)
            str = format_str(str)
        # 计算除法
        elif expr.count('/') == 1:
            # 获取要计算的2个数字
            x, y = expr.split('/')
            # 计算乘法
            div_result = str(float(x) / float(y))
            # 结果替换表达式
            str = str.replace(expr, div_result)
            str = format_str(str)
        # 计算幂次方
        elif expr.count('*') == 2:
            # 获取要计算的2个数字
            x, y = expr.split('*')
            # 计算幂次方
            pow_result = 1
            for i in range(int(y)):
                pow_result *= int(x)
            # 结果替换表达式
            str = str.replace(expr, str(pow_result))
            str = format_str(str)
    return  str


# 加减法运算
def cal_div_sub(str):
    # 取出第一个乘法或者除法的表达式
    add_regular = '[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'
    sub_regular = '[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'
    # 计算加法
    add_list = re.findall(add_regular, str)
    for add_str in add_list:
        x, y = add_str.split('+')
        add_result = "+" + str(float(x) + float(y))
        str = str.replace()
        return str
    # 计算减法
    sub_list = re.findall(sub_regular, str)
    for sub_str in sub_list:

if __name__ == '__main__':
    ss = '1 - 2 * ((60 - 30 + (-40/5) * (9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14)) - (-4 * 3) / (16 - 3 * 2))'
    if check_exp(ss):
        print('Source:', ss)
        print('eval result:', eval(ss))
        ss = format_str(ss)
        print('Format result:', ss)
        # 判断是否右括号
        while ss.coumt('(') > 0:
            # 取出括号
            str = re.search('\([^()]*\)', ss).group()
            # 将括号的表达式进行乘法除法运算
            replace_str = cal_mul_div(str)
            # 将运算结果进行加法减法运算
            replace_str = cal_div_sub(replace_str)
            # 将括号的字符串替换为计算结果,结果包含(),替换时去掉():[1:-1]
            ss = format_str(ss.replace(str, replace_str[1:-1]))
        else:
            replace_str = cal_mul_div(ss)
            # 将运算结果进行加法减法运算
            replace_str = cal_div_sub(replace_str)
            # 将括号的字符串替换为计算结果,结果包含(),替换时去掉():[1:-1]
            ss = ss.replact(ss, replace_str)
        print("Final result:", ss.replace('+', ''))
 

【更多参考】

Python实例---利用正则实现计算器[参考版]

Java实例---计算器实例

posted @ 2018-07-28 21:06  小a玖拾柒  阅读(363)  评论(0编辑  收藏  举报