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


    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))
  • 相关阅读:
    20、插入横向文本框,输入文字后,文字周围有留白
    46、文字工具
    19、表格—单元格输入文字后,四周留白边
    50、路径选择工具
    48、钢笔工具【P】—形状
    49、路径和形状
    leetcode 235. Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最近公共祖先(简单)
    leetcode 226. Invert Binary Tree 翻转二叉树(简单)
    leetcode 208. Implement Trie (Prefix Tree) 实现 Trie (前缀树) (中等)
    leetcode 144. Binary Tree Preorder Traversal 二叉树展开为链表(中等)
  • 原文地址:https://www.cnblogs.com/chen/p/11661811.html
Copyright © 2020-2023  润新知