计算器程序编写_python

一、计算一串字符串的最终值,相当于eval函数功能:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
#Author:chenxz
import re
def check(s):  #检查字符串函数是否合法
    s=s.replace(' ','').strip() #去除空格
    if len(re.findall('\(',s)) != len(re.findall('\)',s)):#判断括号是否成对
        print("括号不匹配")
        exit()
    if re.search('(\([*+/])|([*+\-/]\))',s): #判断是否含(*/+ 或+-*/) 这种不合法的
        print('格式不正确')
        exit()
    return s

def count_last(sub_str):  #处理n[+-*/]mg格式计算值
    sub_str=re.sub('\+-','-',sub_str)  #格式化
    sub_str=re.sub('--', '+', sub_str) #格式化
    if '*' in sub_str:  #计算乘
        sub_list=sub_str.split('*')
        res=str(float(sub_list[0])*float(sub_list[1]))
    elif '/' in sub_str: #计算除
        sub_list=sub_str.split('/')
        res=str(float(sub_list[0])/float(sub_list[1]))
    elif '+' in sub_str: #计算加
        sub_list=sub_str.split('+')
        res=str(float(sub_list[0])+float(sub_list[1]))
    elif '-' in sub_str: #计算减
        sub_list=sub_str.split('-')
        res=str(float(sub_list[0])-float(sub_list[1]))
    return res

def count_mid(cal_str): #处理类似(1+3*5)的字符串中间函数
    cal_str = cal_str[1:-1]  #去除括号
    while re.search('\d+\.?\d{0,}[*/]-?\d+\.?\d{0,}',cal_str):  #循环匹配乘除
        sub_str=re.search('\d+\.?\d{0,}[*/]-?\d+\.?\d{0,}',cal_str).group()
        res=count_last(sub_str)#子函数计算n[*/]m返回对应值
        cal_str=cal_str.replace(sub_str,res)#对应值替代
    while re.search('\d+\.?\d{0,}[+\-]-?\d+\.?\d{0,}',cal_str):#循环匹配加减
        sub_str=re.search('\d+\.?\d{0,}[+\-]-?\d+\.?\d{0,}',cal_str).group()
        res=count_last(sub_str)#子函数计算n[+-]m返回对应值
        cal_str=cal_str.replace(sub_str,res) #对应值替代
    return cal_str

s= '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
s=check(s) #检查输入的合法性
while re.search('\([^()]+\)',s):  #循环将最里面的括号找出来
    cal_str=re.search('\([^()]+\)',s).group()
    res=count_mid(cal_str)  #最里面的括号和表达式,通过处理函数返回对应值
    s=s.replace(cal_str,res) #对应值替代
s=count_mid('(%s)'%s)  #去除完括号之后的字符串,加上括号给count_mid函数能自动计算除结果
print(s)  #2776677.4952380955

 

你可能感兴趣的:(计算器程序编写_python)