首页 > 代码库 > 正则表达式计算 origin = "1 - 2 * ( ( 60 - 30 + ( -40.0 / 5 ) * ( 9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14 )) - ( - 4 * 3 ) / ( 16 - 3 * 2))"

正则表达式计算 origin = "1 - 2 * ( ( 60 - 30 + ( -40.0 / 5 ) * ( 9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14 )) - ( - 4 * 3 ) / ( 16 - 3 * 2))"

元字符:
    .    ^    $    *     +     ?     { }     [ ]     |     ( )     \

技术分享

特殊符号:

\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b: 匹配一个单词边界,也就是指单词和空格间的位置。

 

1 - 2 * ( (60 - 30 + (-40.0/5) * (9 - 2 * 5/3 + 7 / 3 * 10/4*2 +10 *5/14)) -(-4*3)/(16-3*2))

技术分享
import re


def add_op(arg):  # 定义加法函数
    arg = arg.replace("++", "+").replace("--", "+").replace("+-", "-").replace("-+", "-")  # 替换符号
    num = re.findall("([+\-]?\d+\.?\d*)", arg)  #匹配所有数字
    result = 0
    for i in num:   #循环数字列表进行累加
        result = result + float(i)
    return result

def mul(arg):   #定义乘除函数
    while True:
        result = re.split("(\d+\.?\d*[\*/][\+-]?\d+\.?\d*)",arg,1) #匹配乘法或除法
        if len(result) == 3:
            bef,cen,aft = result
            if "*" in cen:  #判断乘号是否在cen里面
                num1,num2 = cen.split("*")  #将乘号进行分割得到乘数
                new_cen = float(num1) * float(num2)     #将乘数相乘得到乘积
                arg = bef +str(new_cen) + aft   #将乘积放入新的字符串表达式
            elif "/" in cen:    #判断除号是否在cen里面
                num1,num2 = cen.split("/")  #分割除号得到除数和被除数
                new_cen = float(num1) / float(num2)     #进行除法运算
                arg = bef + str(new_cen) + aft      #将商放入新的字符串表达式
        else:
            return add_op(arg)

def calc(arg):
    while True:
        arg = arg.replace(" ","")
        result = re.split("\(([^()]+)\)",arg,1)     #匹配最里面的括号并且只取括号中的内容
        if len(result) == 3:
            bef,cen,aft = result
            # 计算括号中的表达式,先乘除后加减,得到计算结果
            r = mul(cen)
            #使用计算结果组成新的字符串表达式
            arg = bef + str(r) + aft
        else:   #计算完括号后开始按照先乘除再加减的运算
            return mul(arg)

origin = "1 - 2 * ( (60 - 30 + (-40.0/5) * (9 - 2 * 5/3 + 7 / 3 * 10/4*2 +10 *5/14)) -(-4*3)/(16-3*2))"
r = calc(origin)
print(r)
print(eval(origin))
View Code

 

正则表达式计算 origin = "1 - 2 * ( ( 60 - 30 + ( -40.0 / 5 ) * ( 9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14 )) - ( - 4 * 3 ) / ( 16 - 3 * 2))"