zoukankan      html  css  js  c++  java
  • 使用re开发python计算器

    #!/usr/bin/env python

    import re
    import functools

    def minus_operator_handler(formula):
    '''处理一些特殊的减号运算'''
    minus_operators = re.split("-",formula)
    calc_list = re.findall("[0-9]",formula)
    if minus_operators[0] == '': # 第一个值肯定是负号
    calc_list[0] = '-%s' % calc_list[0]
    result = functools.reduce(lambda x,y: float(x) - float(y),calc_list)
    print(" - [%s] of result is : " % formula, result )
    return result

    def handle_minus_in_list(operator_list,calc_list):
    '''
    有的时候把算术符和值分开后,会出现这种情况 ['-', '-', '-'] [' ', '14969037.996825399 ', ' ', '12.0/ 10.0 ']
    这需要把第2个列表中的空格都变成负号并与其后面的值拼起来
    '''
    for index,item in enumerate(calc_list):
    if item == '':
    calc_list[index+1] = item + calc_list[index+1].strip()

    def compute_mutiply_and_dividend(formula):
    '''计算乘除的内容,这里传进来的是字符串'''
    # 找出所有带*、/符号的内容
    operators = re.findall("[*/]",formula)
    # 以*、/为分隔符,取出所有排除掉*、/的内容
    calc_list = re.split("[*/]",formula)
    # 结果初始化未None
    result = None
    # 遍历显示数组中的索引号(index)、内容(i)
    for index,i in enumerate(calc_list):
    if result: # 代表不是第一次循环
    if operators[index-1] == "*":
    result *= float(i)
    elif operators[index-1] == "/":
    result /= float(i)
    else:
    result = float(i)
    print("[%s] of result is : " %formula, result)
    return result

    def handle_special_occactions(plus_and_minus_operators,multiply_and_dividend):
    '''有时会出现这种情况 , ['-', '-'] ['1 ', ' 2 * ', '14969036.7968254'],2*...后面这段实际是 2*-14969036.7968254,需要特别处理下'''
    # 遍历显示数组multiply_and_dividend中的索引号(index)、内容(i)
    for index,i in enumerate(multiply_and_dividend):
    # 清除空格、空白
    i = i.strip()
    # 如果 内容的结尾是*、/
    if i.endswith("*") or i.endswith("/"):
    multiply_and_dividend[index] = multiply_and_dividend[index] + plus_and_minus_operators[index] + multiply_and_dividend[index+1]
    del multiply_and_dividend[index+1]
    del plus_and_minus_operators[index]
    return plus_and_minus_operators,multiply_and_dividend

    def remove_addsubtract(formula):
    '''将加减组合的符号替换成合并后的符号'''
    formula = formula.replace("++","+")
    formula = formula.replace("--","+")
    formula = formula.replace("+-","-")
    formula = formula.replace("-+","-")
    formula = formula.replace("- -","+")
    return formula

    def compute(formula):
    '''这里计算不带括号的内容'''
    # 去掉外层的括号
    formula = formula.strip("()") # strip是去除的函数
    # 将加减组合的符号替换成合并后的符号
    formula = remove_addsubtract(formula)
    # 找出替换后剩余的所有带+、-符号的内容
    plus_and_minus_operators = re.findall("[+-]",formula)
    # 以+、-为分隔符,取出所有排除掉+、-的内容,即取出所有*/的内容
    multiply_and_dividend = re.split("[+-]",formula)
    if len(multiply_and_dividend[0].strip()) == 0: # 代表这肯定是个减号
    multiply_and_dividend[1] = plus_and_minus_operators[0] + multiply_and_dividend[1]
    del multiply_and_dividend[0]
    del plus_and_minus_operators[0]
    plus_and_minus_operators,multiply_and_dividend = handle_special_occactions(plus_and_minus_operators,multiply_and_dividend)
    # 遍历显示数组multiply_and_dividend中的索引号(index)、内容(i)
    for index,i in enumerate(multiply_and_dividend):
    if re.search("[*/]",i):
    calc_inside_result = compute_mutiply_and_dividend(i)
    multiply_and_dividend[index] = calc_inside_result

    '''开始运算+、-'''
    print(multiply_and_dividend,plus_and_minus_operators)
    total_result = None # 初始化total_result
    # 遍历显示数组multiply_and_dividend中的索引号(index)、内容(item)
    for index,item in enumerate(multiply_and_dividend):
    if total_result: # 代表不是第一次循环
    if plus_and_minus_operators[index-1] == "+":
    total_result += float(item)
    elif plus_and_minus_operators[index-1] == "-":
    total_result -= float(item)
    else:
    total_result = float(item)
    print("[%s] of result is : " %formula,total_result)
    return total_result

    def calc(formula):
    '''计算程序主入口, 主要逻辑是先计算括号里的值,算出来后再算乘除,再算加减'''
    #给括号的状态设置初始值,假定括号存在
    parenthesis_flag = True
    #初始化运算结果为None,还没开始运算
    calc_result = None
    while parenthesis_flag:
    #找到最里面一层的括号。正则表达式:()中间没有()的所有字符
    inside = re.search("([^()]*)",formula)
    if inside:
    # 先计算括号里面的值
    calc_inside_result = compute(inside.group())
    formula = formula.replace(inside.group(),str(calc_inside_result))
    else:
    print('33[41;1m~~~没括号了~~~33[0m')
    print('The End Result is : ',compute(formula))
    # 公式中的括号都被剔除了
    parenthesis_flag = False

    #程序的入口
    if __name__ == '__main__':
    result = calc("1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )")

  • 相关阅读:
    Querying for Event Information
    通过注册表查询 .Net Framework 的版本
    [Batch脚本] if else 的格式
    逆天技能
    财运是靠自己争取的,而财商是可以通过后天学习提高的
    必须冒着可能付出惨痛代价的风险前进,否则你就只能永远做个井底之蛙
    财商低的六种表现
    中国大唐集团公司 主要经营范围
    中国大唐集团公司是2002年12月29日在原国家电力公司部分企事业单位基础上组建而成的特大型发电企业集团
    中国大唐集团公司在役及在建资产分布在全国31个省区市以及境外
  • 原文地址:https://www.cnblogs.com/bigriverx/p/9643923.html
Copyright © 2011-2022 走看看