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()
  • 相关阅读:
    准爸爸日记之二
    生日的纪念
    未将对象引用设置到对象的实例未将对象引用设置到对象的实例(C#)
    读《中国合伙人》
    Command模式实例(C#)
    开源的C#项目
    抽象工厂模式(C#)
    桥模式(Bridge Pattern)
    抽象工厂模式实例(C#)
    适配器模式实例(C#)
  • 原文地址:https://www.cnblogs.com/hqd2008/p/7732483.html
Copyright © 2011-2022 走看看