`

python 实现简单的数字字符串四则运算

 
阅读更多

#!/usr/bin/python
#  -*- coding: utf-8 -*-

import  re

# sexp = "512+((112+212)*2-312)"
# 主函数入口
def myCalculate(mystr):
    if(mystr.__contains__("(")):
        start = mystr.rindex("(")
        lstr=mystr[0:start]
        tmpstr=mystr[start+1:]
        end = tmpstr.index(")")
        rstr=tmpstr[end+1:]
        nowstr=tmpstr[0:end]
        newstr =lstr+str(myCalculate(nowstr))+rstr
        return myCalculate(newstr)
    else:
        return calcNoSym(mystr)



def calcNoSym(string):
    if(string.__contains__("*")):
        string=getNewStr(string,"*")
        return calcNoSym(string)
    if(string.__contains__("/")):
        string=getNewStr(string,"/")
        return calcNoSym(string)
    if(string.__contains__("+")):
        string=getNewStr(string,"+")
        return calcNoSym(string)
    if(string.__contains__("-")):
        string=getNewStr(string,"-")
        return calcNoSym(string)
    return string


def getNewStr(string,op):
        start = string.index(op)
        lstr=string[0:start]
        rstr=string[start+1:]
        lnum =re.search('\d+$',lstr).group()
        rnum =re.search('\d+',rstr).group()
        newstr = lstr.rstrip(lnum)+str(calcs(lnum,rnum,op))+rstr.lstrip(rnum)
        return newstr

def calcs(num1, num2,op):
    if(op=="+"):
        return int(num1)+int(num2)
    elif(op=="-"):
         return int(num1)-int(num2)
    elif(op=="*"):
         return int(num1)*int(num2)
    elif(op=="/"):
         return int(num1)/int(num2)
    else:
        raise "error"

string="11*22*3/4"

print(myCalculate(string))
sexp = "512+((112+212)*2-312)"
print(myCalculate(sexp))

 

分享到:
评论
2 楼 xdx2599 2016-01-28  
#!/usr/bin/python
#  -*- coding: utf-8 -*-

import  re
import math

# sexp = "512+((112+212)*2-312)"
# 主函数入口
def myCalculate(mystr):
    if(mystr.__contains__("(")):
        start = mystr.rindex("(")
        lstr=mystr[0:start]
        tmpstr=mystr[start+1:]
        end = tmpstr.index(")")
        rstr=tmpstr[end+1:]
        nowstr=tmpstr[0:end]
        newstr =lstr+str(myCalculate(nowstr))+rstr
        return myCalculate(newstr)
    else:
        return calcNoSym(mystr)



def calcNoSym(string):
    if(string.isdigit()):
        return string
    if(string.startswith("-")):
        if(string[1:].isdigit()):
            return string
    if(string.__contains__("*")):
        string=getNewStr(string,"*")
        return calcNoSym(string)
    elif(string.__contains__("/")):
        string=getNewStr(string,"/")
        return calcNoSym(string)
    elif(string.__contains__("+")):
        string=getNewStr(string,"+")
        return calcNoSym(string)
    elif(string.__contains__("-")):
        if(string.startswith("-")):
                if(string[1:].isdigit()):
                    return string
        else:
            string=getNewStr(string,"-")
            return calcNoSym(string)
    return string

def isOperator(str):
    if(str=="+" or str=="-" or str=="*" or str=="/"):
        return True
    else:
        return False


def getNewStr(string,op):
            start = string.index(op)
            lstr=string[0:start]
            rstr=string[start+1:]
            #如果左侧是运算符
            lone = lstr[start-1:start]
            rone = rstr[start+1:start+2]
            if(isOperator(rone)):
                rstr=rstr[start+1:]
            lres = re.search('\d+$',lstr)
            if(lres):
                lnum =lres.group()
            else:
                lnum=lstr
            rres =re.search('\d+',rstr)
            if(rres):
                rnum =rres.group()
            else:
                rnum=rstr
            if(isOperator(rone)):
                rnum=rone+rnum
            if(isOperator(lone)):
                rnum=op+rnum
                op = lone
            if(rnum=="" or lnum==""):
                centerstr=lnum+rnum
            else:
                centerstr=str(calcs(lnum,rnum,op))
            newstr = lstr.rstrip(lnum)+centerstr+rstr.lstrip(rnum)
            return newstr

def calcs(num1, num2,op):
    if(op=="+"):
        return  round(int(num1)+int(num2),0)
    elif(op=="-"):
         return round(int(num1)-int(num2),0)
    elif(op=="*"):
         return round(int(num1)*int(num2),0)
    elif(op=="/"):
         return round(int(num1)/int(num2),0)
    else:
        raise "error"

# string="11*22*3/4"
#
# print(myCalculate(string))
# sexp = "512+((112+212)*2-312)"
# print(myCalculate(sexp))

test="1-2*((4*3))"
print(myCalculate(test))
# rres =re.search('\d+',test)
# print(rres)
#
# a="-1"
# print(a.startswith("-"))
# print(a[1:].isdigit())
1 楼 xdx2599 2016-01-27  
#!/usr/bin/python
#  -*- coding: utf-8 -*-

import  re
import math

# sexp = "512+((112+212)*2-312)"
# 主函数入口
def myCalculate(mystr):
    if(mystr.__contains__("(")):
        start = mystr.rindex("(")
        lstr=mystr[0:start]
        tmpstr=mystr[start+1:]
        end = tmpstr.index(")")
        rstr=tmpstr[end+1:]
        nowstr=tmpstr[0:end]
        newstr =lstr+str(myCalculate(nowstr))+rstr
        return myCalculate(newstr)
    else:
        return calcNoSym(mystr)



def calcNoSym(string):
    if(string.__contains__("*")):
        string=getNewStr(string,"*")
        return calcNoSym(string)
    elif(string.__contains__("/")):
        string=getNewStr(string,"/")
        return calcNoSym(string)
    elif(string.__contains__("+")):
        string=getNewStr(string,"+")
        return calcNoSym(string)
    elif(string.__contains__("-")):
        string=getNewStr(string,"-")
        return calcNoSym(string)
    return string


def getNewStr(string,op):
        # if(string.isdigit):
        #     return string
        # else:
            start = string.index(op)
            lstr=string[0:start]
            rstr=string[start+1:]
            lres = re.search('\d+$',lstr)
            if(lres):
                lnum =lres.group()
            else:
                lnum=lstr
            # print(lres)
            # if (lres):
            #     print(lres)
            #     print(lstr)
            rres =re.search('\d+',rstr)
            if(rres):
                rnum =rres.group()
            else:
                rnum=rstr
            newstr = lstr.rstrip(lnum)+str(calcs(lnum,rnum,op))+rstr.lstrip(rnum)
            return newstr

def calcs(num1, num2,op):
    if(op=="+"):
        return  round(int(num1)+int(num2),0)
    elif(op=="-"):
         return round(int(num1)-int(num2),0)
    elif(op=="*"):
         return round(int(num1)*int(num2),0)
    elif(op=="/"):
         return round(int(num1)/int(num2),0)
    else:
        raise "error"

# string="11*22*3/4"
#
# print(myCalculate(string))
# sexp = "512+((112+212)*2-312)"
# print(myCalculate(sexp))

test="1-2*((4*3))"
print(myCalculate(test))

相关推荐

Global site tag (gtag.js) - Google Analytics