• 基于正则和迭代模式的计算器源码


    源码如下:

     1 # encoding:utf-8
     2 # Author:"richie"
     3 # Date:2017/8/8
     4 import re
     5 # 待处理数据
     6 s =  '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'
     7 pat_bracket = re.compile(r"""([^(]*?)""", re.X)  # 过滤括号内的算数表达式
     8 pat_divmod = re.compile(r"""d+.?d*[*/]-?d+.?d*""", re.X) # 过滤乘除算数表达式
     9 pat_add = re.compile(r"""-?d+.?d*[+-]-?d+.?d*""", re.X) # 过滤加减算术表达式
    10 
    11 
    12 def my_sum(str_inner_new,ret = 0):
    13     """
    14     基本算数运算函数
    15     :param str_inner_new: 一个数学表达式字符串
    16     :param ret: 返回的默认参数
    17     :return: 返回运算结果 以字符串形式
    18     """
    19     # 如果传入的表达式中含有'--'则用'+'替换
    20     str_inner_new = str_inner_new.replace('--', '+') if '--' in str_inner_new else str_inner_new
    21 
    22     if '*' in str_inner_new: # 表达式为乘法运算
    23         number_l = str_inner_new.split('*') 
    24         ret = float(number_l[0]) * float(number_l[1])
    25     elif '/' in str_inner_new:# 表达式为除法运算
    26         number_l = str_inner_new.split('/')
    27         ret = float(number_l[0]) / float(number_l[1])
    28     elif re.search('[-+]', str_inner_new) is not None: # 表达式为加法和减法运算
    29         number_l = str_inner_new.split('+') if '+' in str_inner_new else  str_inner_new.replace('-', ' -').split()
    30         ret = sum([float(i) for i in number_l]) 
    31     return str(ret)
    32 
    33 def my_eval(pat, data):
    34     """
    35     算数运算函数
    36     :param pat: 过滤算数运算表达式
    37     :param data: 需要运算的表达式
    38     :return: 运算结果
    39     """
    40     # 当过滤的data中没有括号,没有加减乘除运算表达式,表示已经运算完成,退出函数
    41     if pat_bracket.search(data) is None and pat_divmod.search(data) is None and pat_add.search(data) is None :
    42         return data.replace('--', '')
    43     if pat.search(data) is not None and pat == pat_bracket:  # 如果找到括号内容
    44         str_inner = re.sub(r'[()]', '', pat.search(data).group(0)) # 去除表达式括号
    45         # 运算括号内的表达式,求出结果,然后用运算结果替换括号表达式内容
    46         return my_eval(pat, data.replace(pat.search(data).group(0), my_eval(pat_divmod, str_inner)))
    47     elif pat == pat_bracket: # 如果data中找不到括号内容,则运算乘除法或加减法
    48         return my_eval(pat_divmod, data) if pat_divmod.search(data) is not None else my_eval(pat_add, data)
    49     elif pat.search(data) is None: # 如果没有括号,没有乘除法,则运算加减法
    50         return my_eval(pat_add, data)
    51     ret = my_sum(pat.search(data).group(0))  # 运算基本表达式结果
    52     return my_eval(pat, data.replace(pat.search(data).group(0), ret))
    53 # 输出表达式运算结果
    54 print(eval(s), my_eval(pat_bracket, s))
  • 相关阅读:
    js实现将字符串里包含手机号的中间四位替换为****
    草稿for套for
    js实现将时间戳转换成2017-05-06 09:03:02
    时间日期校验接口
    JS延迟导航nav
    nav导航
    鼠标滚动请求加载
    常用开源Jabber(XMPP) IM服务器介绍(转)
    01.base-v1.js
    Haproxy安装及配置(转)
  • 原文地址:https://www.cnblogs.com/richiewlq/p/7359866.html
Copyright © 2020-2023  润新知