zoukankan      html  css  js  c++  java
  • 基于正则和迭代模式的计算器源码-升级版

    代码如下:

     1 # encoding:utf-8
     2 # Author:"richie"
     3 # Date:8/18/2017
     4 
     5 import re
     6 # 待处理数据
     7 s =  '(1-2)*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*-2998+10*568/14))-(-4*3)/(16-3*2))'
     8 pat_bracket = re.compile(r"""([^(]*?)""", re.X)  # 过滤括号内的算数表达式
     9 pat_divmod = re.compile(r"""d+.?d*[*/]-?d+.?d*""", re.X) # 过滤乘除算数表达式
    10 pat_add_compute = re.compile(r"""(?P<x>[-]?d+.?d*)(?P<mark>[*/+-])(?P<y>[-]?d+.?d*)""", re.X)
    11 
    12 def my_sum(str_msg,ret = 0):
    13     """
    14     基本算数运算函数
    15     :param str_msg: 一个数学表达式字符串
    16     :param ret: 返回的默认参数
    17     :return: 返回运算结果 以字符串形式
    18     """
    19     # 如果传入的表达式中含有'--'则用'+'替换
    20     str_msg = str_msg.replace('--', '+') if '--' in str_msg else str_msg
    21     dic = pat_add_compute.search(str_msg).groupdict()
    22     x, y = float(dic['x']), float(dic['y'])
    23     if dic['mark'] == '+':
    24         return x + y
    25     elif dic['mark'] == '-':
    26         return x - y
    27     elif dic['mark'] == '*':
    28         return x * y
    29     else:
    30         return x / y
    31 
    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_add_compute.search(data) is None:
    42         return data.replace('--', '')
    43     if pat.search(data) is not None and pat == pat_bracket:  # 如果找到括号内容
    44         ret =  pat.search(data).group(0)
    45         return my_eval(pat, data.replace(ret, my_eval(pat_divmod, ret.strip('()'))))
    46     elif pat == pat_bracket: # 如果data中找不到括号内容,则运算乘除法或加减法
    47         return my_eval(pat_add_compute, data)
    48     elif pat.search(data) is None: # 如果没有括号,没有乘除法,则运算加减法
    49         return my_eval(pat_add_compute, data)
    50     ret = pat.search(data).group(0)
    51     return my_eval(pat, data.replace(ret, str(my_sum(ret))))
    52 # 输出表达式运算结果
    53 print(eval(s), my_eval(pat_bracket, s))
  • 相关阅读:
    Vue2.0的变化(2)———vue2.0动画的变化、vue-2.0路由的变化
    Vue2.0的变化(1)——vue2.0组件定义/生命周期/循环/自定义键盘/过滤器/组件通信的变化
    YK-iSystem后台管理系统介绍
    通过docker,部署SpringCloud项目
    Quarz框架学习
    安装CentOS6.9虚拟机
    消息中间件JMS(三)
    消息中间件JMS(二)
    消息中间件JMS(一)
    网页静态化技术Freemarker
  • 原文地址:https://www.cnblogs.com/richiewlq/p/7388994.html
Copyright © 2011-2022 走看看