利用正则表达式模拟计算器进行字符串的计算实现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