Python用正则实现计算字符串算式

本文介绍了如何使用Python正则表达式处理字符串算式,通过逐步解析、去除括号并根据算术逻辑计算,实现类似eval()的功能。文章详细讲解了整个过程,包括获取最内层括号、处理乘除和加减运算,以及如何递归处理无括号的算式。
摘要由CSDN通过智能技术生成

Python用正则实现计算字符串算式

  • 在Python里面其实有一种特别方便实用的直接计算字符串算式的方法

  • 那就是eval()

    s = '1+2*(6/2-9+3*(3*9-9))'
    print(eval(s))
    
    #97.0
    
  • 好了,我现在就是想用正则写一个类似这样功能的东西

  • 第一步,我们拿到一个算式,例如’1+2*(6/2-9+3*(3*9-9))’

    • 按照我们小学学的知识我们应该知道我们应该从最内层括号里面的算式开始计算

    • 那我们怎么拿到最内层括号里面的算式呢?我们可以用正则啊

      import re
      pattern = re.compile(r'\([^(^)]*?\)')
      s = '1+2*(6/2-9+3*(3*9-9))+(6-3)'
      ret = pattern.findall(s)
      print(ret)
      #['(3*9-9)','(6-3)']
      
    • 好了,我们现在就拿到了最内层括号以及里面的算式了,第一步完成

  • 第二步,我们要把拿到的内容给它去掉括号

    • 因为我们拿到的最内层的括号可能不止一个,所以我们用一个新的列表来存一下去掉括号里面的算式

      ret2 = []
      pattern2 = re.compile(r'\((?P<tag>.*?)\)')
      for i in range(len(ret)):
          ret3 = pattern2.search(ret[i])
          ret2.append(ret3.group('tag'))
      print(ret2)
      #['3*9-9', '6-3']
      
    • 其实到这里我们几乎已经成功一大半了

  • 第三步,我们就要来安排我们拿到的最内层括号的算式了

    • 这里只展示逻辑,我就只拿’3*9-9’(ret2[1])来说了

    • 我们还是得根据算术逻辑来,先乘除,后加减

    • 乘除

      def mul_div(s):
          if '*' in s:
              s = s.split('*')
              return float(s[0]) * float(s[1])
          elif '/' in s:
              s = s.split('/')
              return float(s[0]) / float(s[1])
      
      
      
      while True:
          pattern3 = re.compile(r'[-+*/]?(?P<tag>-?\d+(\.\d+)?[*/]-?\d+(\.\d+)?)')
          ret3 = pattern3.search(ret2[1])
          try:
              ret4 = ret3.group
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值