加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python用正则对字符串进行运算

发布时间:2020-12-20 10:20:17 所属栏目:Python 来源:网络整理
导读:import re def nul_div(source): """ 处理乘法和除法,先利用搜索出需要进行乘法和除法的表达式,然后利用正则将字符串分割,进行乘法和除法的运算 :param source: 要进行计算的字符串 :return: 将计算过的表达式替换到原有字符串,返回计算后的字符串 """ s
import re


def nul_div(source):
    """
    处理乘法和除法,先利用搜索出需要进行乘法和除法的表达式,然后利用正则将字符串分割,进行乘法和除法的运算
    :param source: 要进行计算的字符串
    :return: 将计算过的表达式替换到原有字符串,返回计算后的字符串
    """
    source = str_format(source)
    while re.search(*|/,source):
        ret = re.search([. 0-9]+?[*/][+-]?[. 0-9]+,source).group()
        res_data = re.findall((-?[d.]+|*|/),ret)
        if res_data[1] == *:
            res = float(res_data[0]) * float(res_data[2])
        else:
            res = float(res_data[0]) / float(res_data[2])
        source = source.replace(ret,str(res))
    return source


def add_sub(source):
    """
    处理加法和减法,先利用搜索出需要进行加法和减法的表达式,然后利用正则将字符串分割,进行加法和减法的运算
    :param source: 要进行计算的字符串
    :return: 将计算过的表达式替换到原有字符串,返回计算后的字符串
    """
    source = str_format(source)
    while re.search([+-]?[.0-9]*[+-]+[.0-9]*,source):
        ret = re.search([+-]?[.0-9]*[+-]+[.0-9]*,source).group()
        res_data = re.findall(r([d.]+|+|-),ret)
        if len(res_data) == 2:
            if res_data[0] == -:
                res = -float(res_data[1])
            else:
                res = float(res_data[1])
            source = source.replace(ret,str(res))
            return source
        elif len(res_data) > 2:
            if res_data[0] == -:
                if res_data[2] == -:
                    res = - float(res_data[1]) - float(res_data[3])
                else:
                    res = - float(res_data[1]) + float(res_data[3])
            elif res_data[0] == +:
                if res_data[2] == -:
                    res = float(res_data[1]) - float(res_data[3])
                elif res_data[2] == +:
                    res = float(res_data[1]) + float(res_data[3])
                else:
                    res = float(res_data[1])
            else:
                if res_data[1] == -:
                    res = float(res_data[0]) - float(res_data[2])
                else:
                    res = float(res_data[0]) + float(res_data[2])
        else:
            res = float(res_data[0])
            source = source.replace(ret,str(res))
            return source
        source = source.replace(ret,str(res))
    return source


# def add_sub(source):
#     """
#     处理加法和减法,先利用搜索出需要进行加法和减法的表达式,然后利用正则将字符串分割,进行加法和减法的运算
#     :param source: 要进行计算的字符串
#     :return: 将计算过的表达式替换到原有字符串,返回计算后的字符串
#     """
#     source = str_format(source)
#     while re.search(‘[. 0-9]+?[+-][. 0-9]+‘,source):
#         ret = re.search(‘[+-]?[.0-9]+?[+-][. 0-9]+‘,source).group()
#         print(ret)
#         res_data = re.findall(r‘([d.]+|+|-)‘,ret)
#         print(res_data)
#         if res_data[0] == ‘-‘:
#             if res_data[2] == ‘-‘:
#                 res = - float(res_data[1]) - float(res_data[3])
#             else:
#                 res = - float(res_data[1]) + float(res_data[3])
#         elif res_data[0] == ‘+‘:
#             if res_data[2] == ‘-‘:
#                 res = float(res_data[1]) - float(res_data[3])
#             else:
#                 res = float(res_data[1]) + float(res_data[3])
#         else:
#             if res_data[1] == ‘-‘:
#                 res = float(res_data[0]) - float(res_data[2])
#             else:
#                 res = float(res_data[0]) + float(res_data[2])
#         source = source.replace(ret,str(res))
#     return source


def check_expression(source):
    """
    检查字符串是否可以进行正常计算,看括号是否相等,是否含有字母
    :param source: 要进行计算的字符串
    :return: 如果不能正常进行计算返回False,否则返回True
    """
    check_result = True
    if not source.count(() == source.count()):
        print(表达式错误!请检查表达式中"("")"是否相等)
        check_result = False
    if re.findall([a-z],source.lower()):
        print(表达式错误!请检查表达式中是否含有字母)
        check_result = False
    return check_result


def str_format(source):
    """
    对字符串进行简单的替换,替换空格和加减法的符号
    :param source: 要进行替换的字符串
    :return: 返回替换后的字符串
    """
    source = source.replace( ,‘‘)
    source = source.replace(++,+)
    source = source.replace(+-,-)
    source = source.replace(-+,-)
    source = source.replace(--,+)
    return source


def str_calculation(source):
    """
    计算字符串,先判断是否可以计算,然后进行简单的替换,判断是否含有括号,进行计算
    :param source: 要进行计算的字符串
    :return: 返回计算结果
    """
    if check_expression(source):
        data = str_format(source)
        while re.search((,data):
            r_data = re.search(([^()]+),data).group()
            data_r = nul_div(r_data)
            data_r = add_sub(data_r)
            data = str_format(data.replace(r_data,data_r[1:-1]))
        else:
            data_r = nul_div(data)
            data_r = add_sub(data_r)
            data = str_format(data.replace(data,data_r))
    return data

if __name__ == __main__:
    s = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
    s1 = 1-2*((60-30-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
    s2 = --9
    print(str_calculation(s))
    print(eval(s))
    print(str_calculation(s1))
    print(eval(s1))
    print(str_calculation(s2))
    print(eval(s2))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读