利用正則表達式模擬計算器進行字符串的計算實現eval()內置函數功能


代碼感覺有點繞,剛開始學習python,相關知識點還沒全部學習到,還請各位大神多多指教

import re


# 定義乘法
def mul(string):
    mul1 = re.search('-?\d+(?:\.\d+)?\*-?\d+(?:\.\d+)?', string)
    str1 = mul1.group()
    li = re.split('\*', str1)
    mul_ret = float(li[0]) * float(li[1])
    if mul_ret < 0:
        return string.replace(string[mul1.start(): mul1.end()], str(mul_ret))
    else:
        return string.replace(string[mul1.start(): mul1.end()], '+' + str(mul_ret))


# 定義除法
def div(string):
    div1 = re.search('-?\d+(?:\.\d+)?/-?\d+(?:\.\d+)?', string)
    str1 = div1.group()
    li = re.split('/', str1)
    div_ret = float(li[0]) / float(li[1])
    if div_ret < 0:
        return string.replace(string[div1.start(): div1.end()], str(div_ret))
    else:
        return string.replace(string[div1.start(): div1.end()], '+' + str(div_ret))


# 定義加法
def add(string):
    add1 = re.search('-?\d+(?:\.\d+)?\+-?\d+(?:\.\d+)?', string)
    str1 = add1.group()
    li = re.split('\+', str1)
    add_ret = float(li[0]) + float(li[1])
    return string.replace(string[add1.start(): add1.end()], str(add_ret))


# 定義減法
def sub(string):
    sub1 = re.search('-?\d+(?:\.\d+)?--?\d+(?:\.\d+)?', string)
    str1 = sub1.group()
    if str1[0] == '-':
        str1 = str1[1:]
        li = re.split('-', str1, 1)
        sub_ret = 0 - float(li[0]) - float(li[1])
        return string.replace(string[sub1.start(): sub1.end()], str(sub_ret))
    else:
        li = re.split('-', str1, 1)
        sub_ret = float(li[0]) - float(li[1])
        return string.replace(string[sub1.start(): sub1.end()], str(sub_ret))


# 去除括號
def brackets(string):
    string = re.sub(r' ', '', string)
    n = string.count('(')
    while n:
        n -= 1
        m1 = re.search('(?<=\()[^\(\)]*(?=\))', string)
        str1 = m1.group()
        str1_ret = cal(str1)
        string = string.replace(string[m1.start() - 1: m1.end() + 1], str(str1_ret))
    return string


# 定義不含括號的運算
def cal(string):
li1 = re.findall('\*|/', string)
for i in li1:
if i == '*':
string = mul(string)
elif i == '/':
string = div(string)
if string[0] == '-' or '+':
string = '0' + string
li2 = re.findall('\+|-', string)
n = len(li2)
while n:
string = string.replace('+-', '-')
string = string.replace('--', '+')
string = string.replace('-+', '-')
string = string.replace('++', '+')
n -= 1
li3 = re.findall('\+|-', string)
for i in li3:
if i == '+':
string = add(string)
elif i == '-':
string = sub(string)
return string


def
jm_cal(string):
  cal_ret
= cal(brackets(string))
  return cal_ret

輸入:

s = '-45 + 15 * (12 - 68 / (11 - 5 * 2 + (-9 )/ 4)* 6) / 4 + 6 - (14 / 9 + 8 * (-7) - 6 * 2 + 13) * 12'
print(jm_cal(s))

輸出:

1871.3333333333333

與直接調用eval()內置函數計算結果一致


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM