zoukankan      html  css  js  c++  java
  • 正则表达式之实战--计算器

    # -*- coding: utf-8 -*-
    import re
    #本内容借鉴了别人的compile用法,我觉得这个用起来,代码比较简洁,明了

    bk = re.compile(r'([^()]+)') # 寻找最内层括号规则
    mul = re.compile(r'(d+.?d**-d+.?d*)|(d+.?d**d+.?d*)') # 寻找乘法运算规则
    div = re.compile(r'(d+.?d*/-d+.?d*)|(d+.?d*/d+.?d*)') # 寻找除法运算规则
    add = re.compile(r'(-?d+.?d*+-d+.?d*)|(-?d+.?d*+d+.?d*)') # 寻找加法运算规则
    subt = re.compile(r'(-?d+.?d*-{2}d+.?d*)|(-?d+.?d*-d+.?d*)') # 寻找减法运算规则
    remove = re.compile(r'[^(].*[^)]') # 脱括号规则

    def cal_mul(s):
    '''计算表达式中的乘法'''
    sp = re.split(r'*',mul.search(s).group())
    result = str(float(sp[0]) * float(sp[1]))
    return result

    def cal_div(s):
    '''计算表达式中的除法'''
    sp = re.split(r'/',div.search(s).group())
    result = str(float(sp[0]) / float(sp[1]))
    return result

    def cal_add(s):
    '''计算表达式中的加法'''
    sp = re.split(r'+',add.search(s).group())
    result = re.sub(add,str(float(sp[0]) + float(sp[1])),s,count=1)
    return result

    def cal_subt(s):
    '''计算表达式中的减法'''
    sp = subt.search(s).group()
    if sp.startswith('-'): #如果表达式是以-开头 -1-1
    s1 = re.sub(r'-','+',sp) #将-替换成+ +1+1
    s2 = cal_add(s1) #调用加法 +2
    s3 = re.sub(r'++','-',s2) #将结果替换成- -2
    result = re.sub(subt,s3,s,count=1)
    else:
    s1 = re.split(r'-',sp)
    result = re.sub(subt,str(float(s1[0]) - float(s1[1])),s,count=1)
    return result

    def main():
    while True:
    s = input("请输入计算公式(q退出) >>>>")
    if s == "q":
    exit()
    else:
    s = "".join([i for i in re.split('s+',s)]) #将输入的表达式中空格去掉
    if not s.startswith('(') or not s.endswith(')'): #判断输入是否在括号内
    s = "(%s)"%s # 1+2 -->(1+2)
    while bk.search(s): #判断s中是否有内层括号
    s = re.sub(r'-{2}','+',s) #如果表达式中含有-- --> + 例如:--2 --> +2
    s1 = bk.search(s).group() #找到最内存括号
    if div.search(s1): #判断s1中是否有除法
    s2 = div.search(s1).group() #获得除法的表达式
    s3 = s1.replace(s2,cal_div(s2)) #字符串替换
    if re.search(r'(+?-?d+.?d*)',s3): #判断s3是否为括号内的值 例如:(3)
    s3 = remove.search(s3).group() #将值的括号去掉    (3) --> 3
    s = s.replace(s1,s3) #将s中的s1替换为s3
    elif mul.search(s1): #判断表达式中是否有乘法
    s2 = mul.search(s1).group()
    s3 = s1.replace(s2,cal_mul(s2))
    if re.search(r'(+?-?d+.?d*)',s3):
    s3 = remove.search(s3).group()
    s = s.replace(s1,s3)
    elif subt.search(s1): #判断表达式中是否有减法
    s2 = subt.search(s1).group()
    s3 = s1.replace(s2,cal_subt(s2))
    if re.search(r'(+?-?d+.?d*)',s3):
    s3 = remove.search(s3).group()
    s = s.replace(s1,s3)
    elif add.search(s1): #判断表达式中是否有加法
    s2 = add.search(s1).group()
    s3 = s1.replace(s2, cal_add(s2))
    if re.search(r'(+?-?d+.?d*)',s3):
    s3 = remove.search(s3).group()
    s = s.replace(s1,s3)
    print("计算结果是:%s"%s)

    if __name__ == '__main__':
    main()
  • 相关阅读:
    LeetCode120 Triangle
    LeetCode119 Pascal's Triangle II
    LeetCode118 Pascal's Triangle
    LeetCode115 Distinct Subsequences
    LeetCode114 Flatten Binary Tree to Linked List
    LeetCode113 Path Sum II
    LeetCode112 Path Sum
    LeetCode111 Minimum Depth of Binary Tree
    Windows下搭建PHP开发环境-WEB服务器
    如何发布可用于azure的镜像文件
  • 原文地址:https://www.cnblogs.com/hqd2008/p/7732483.html
Copyright © 2011-2022 走看看