亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python使用正則實現(xiàn)計算字符串算式

 更新時間:2019年12月29日 09:05:19   作者:南柯33  
這篇文章主要介紹了Python使用正則實現(xiàn)計算字符串算式的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

在Python里面其實有一種特別方便實用的直接計算字符串算式的方法

那就是eval()

s = '1+2*(6/2-9+3*(3*9-9))'
print(eval(s))
#97.0

好了,我現(xiàn)在就是想用正則寫一個類似這樣功能的東西

第一步,我們拿到一個算式,例如'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)']

好了,我們現(xiàn)在就拿到了最內層括號以及里面的算式了,第一步完成

第二步,我們要把拿到的內容給它去掉括號

因為我們拿到的最內層的括號可能不止一個,所以我們用一個新的列表來存一下去掉括號里面的算式

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']

其實到這里我們幾乎已經(jīng)成功一大半了

第三步,我們就要來安排我們拿到的最內層括號的算式了

這里只展示邏輯,我就只拿'3*9-9'(ret2[1])來說了

我們還是得根據(jù)算術邏輯來,先乘除,后加減

乘除

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('tag')
 except Exception as e:
 pass
 if '*' not in ret2[1] and '/' not in ret2[1]:
 break 
 else:
 ret2[1] = ret2[1].replace(ret4, str(mul_div(ret4)))

這里的代碼,可能看不明白,我來解釋一下

首先mul_div()就是自己定義的一個計算乘除法的方法

因為正則表達式的約束,并且用的是search,所以一下得到的字符串只可能是字符+'/'+字符或者字符+'*'+字符。所以這里字符串切割,必定會根據(jù)乘除號切成兩個元素的列表

我們算出了字符+'/'+字符或者字符+'*'+字符的值,我們就要用算出來的值替換掉正則匹配的字符串,直到這個字符串中沒有乘除號

加減

def add_sub(s):
 if '+' in s:
 s = s.split('+')
 return float(s[0]) + float(s[1])
 else:
 if s[0] == '-':
  s = s[1::].split('-', 1)
  s[0] = '-' + s[0]
  return float(s[0]) - float(s[1])
 else:
  s = s.split('-', 1)
  return float(s[0]) - float(s[1])
while True:
 pattern3 = re.compile(r'-?\d+(\.\d+)?[-+]-?\d+(\.\d+)?')
 ret3 = pattern3.search(ret2[i])
 try:
 ret4 = ret3.group()
 except Exception as e:
 pass
 if '+' not in ret2[i] and '-' not in ret2[i][1::]:
 break
 else:
 ret2[i] = ret2[i].replace(ret4, str(add_sub(ret4)))

加減法和上面的乘除法沒多少區(qū)別

唯一的區(qū)別就是判斷退出時,一個數(shù)可能是負數(shù),就不能直接判斷負號存不存在了,就要判斷除了第一個位置,其余的位置還存不存在負號

第四步

在這里,我們所有最內層括號算出來的數(shù)都在ret2這個列表里面,我們ret1中存放的是最內層括號以及里面的算式,所以我們將兩者替換就可以了

def str_replace(lst1,lst2):
 for i in range(len(lst1)):
 global str1
 str1 = str1.replace(lst1[i], lst2[i])
 
str_replace(ret1,ret2)

第五步

其實到這里我們離成功就差一小步了

可能你已經(jīng)發(fā)現(xiàn)了,我們這一套下來,就是對一個括號內的算式進行運算,如果沒有括號它最后就不會對它進行操作,那我們就在字符串進來的時候給最外層套一個括號就OK了

str1 = '1+2*(6/2-9+3*(3*9-9))'
str1 = '( )'.replace(' ',str1)

然后拿到一個算式一直重復上面的幾個步驟,直到?jīng)]有括號。

完整代碼

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
# 乘除法
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])
# 加減法
def add_sub(s):
 if '+' in s:
 s = s.split('+')
 return float(s[0]) + float(s[1])
 else:
 if s[0] == '-':
  s = s[1::].split('-', 1)
  s[0] = '-' + s[0]
  return float(s[0]) - float(s[1])
 else:
  s = s.split('-', 1)
  return float(s[0]) - float(s[1])
# 替換字符串
def str_replace(lst1,lst2):
 for i in range(len(lst1)):
 global str1
 str1 = str1.replace(lst1[i], lst2[i])
# 匹配最內層括號
pattern1 = re.compile(r'\([^(^)]*?\)')
str1 = '1+2*(6/2-9+3*(3*9-9))'
str1 = '( )'.replace(' ',str1)
while True:
 if '(' not in str1 and ')' not in str1:
 break
 ret1 = pattern1.findall(str1)
 # 匹配括號內的內容
 ret2 = []
 pattern2 = re.compile(r'\((?P<tag>.*?)\)')
 for i in range(len(ret1)):
 ret = pattern2.search(ret1[i])
 ret2.append(ret.group('tag'))
 # 計算乘除法
 while True:
  pattern3 = re.compile(r'[-+*/]?(?P<tag>-?\d+(\.\d+)?[*/]-?\d+(\.\d+)?)')
  ret3 = pattern3.search(ret2[i])
  try:
  ret4 = ret3.group('tag')
  except Exception as e:
  pass
  if '*' not in ret2[i] and '/' not in ret2[i]:
  break
  else:
  ret2[i] = ret2[i].replace(ret4, str(mul_div(ret4)))
 # 計算加法
 while True:
  pattern3 = re.compile(r'-?\d+(\.\d+)?[-+]-?\d+(\.\d+)?')
  ret3 = pattern3.search(ret2[i])
  try:
  ret4 = ret3.group()
  except Exception as e:
  pass
  if '+' not in ret2[i] and '-' not in ret2[i][1::]:
  break
  else:
  ret2[i] = ret2[i].replace(ret4, str(add_sub(ret4)))
 str_replace(ret1,ret2)
print(str1)
#97.0

結束語

希望以后有人看到了,就不要吐槽我的ret1-ret4的變量命名了

還有不知道有沒有寫清楚,看的人能不能看明白,畢竟一晚上沒睡覺,可能腦子不好使。

我這代碼肯定有很多值得優(yōu)化的地方,所以僅供參考。

哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

總結

以上所述是小編給大家介紹的Python使用正則實現(xiàn)計算字符串算式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

相關文章

  • 關于Python中幾個有趣的函數(shù)和推導式解析

    關于Python中幾個有趣的函數(shù)和推導式解析

    這篇文章主要介紹了關于Python中幾個有趣的函數(shù)和推導式解析,推導式comprehensions,又稱解析式,是Python的一種獨有特性,推導式是可以從一個數(shù)據(jù)序列構建另一個新的數(shù)據(jù)序列的結構體,需要的朋友可以參考下
    2023-08-08
  • python包管理工具pip全面解析

    python包管理工具pip全面解析

    這篇文章主要為大家介紹了python包管理工具pip的全面解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Python中如何使用if語句處理列表實例代碼

    Python中如何使用if語句處理列表實例代碼

    這篇文章主要給大家介紹了關于在Python中如何使用if語句處理列表的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • Python字符串拼接六種方法介紹

    Python字符串拼接六種方法介紹

    這篇文章主要介紹了Python字符串拼接六種方法介紹,具有一定借鑒價值,需要的朋友看可以參考下。
    2017-12-12
  • Python文本處理簡單易懂方法解析

    Python文本處理簡單易懂方法解析

    這篇文章主要介紹了Python文本處理簡單易懂方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Django對數(shù)據(jù)庫進行添加與更新的例子

    Django對數(shù)據(jù)庫進行添加與更新的例子

    今天小編就為大家分享一篇Django對數(shù)據(jù)庫進行添加與更新的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python實現(xiàn)停車場管理系統(tǒng)

    python實現(xiàn)停車場管理系統(tǒng)

    這篇文章主要為大家詳細介紹了python實現(xiàn)停車場管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Python手機與電腦游戲腳本的編寫方法

    Python手機與電腦游戲腳本的編寫方法

    本文給大家分享一個手機和電腦雙平臺的游戲腳本,幫助大家贏得游戲,步驟很簡單,下面小編給大家分享基于Python游戲腳本的編寫方法,感興趣的朋友一起看看吧
    2021-11-11
  • PyTorch零基礎入門之邏輯斯蒂回歸

    PyTorch零基礎入門之邏輯斯蒂回歸

    PyTorch是一個開源的Python機器學習庫,基于Torch,用于自然語言處理等應用程序,它是一個可續(xù)計算包,提供兩個高級功能:1、具有強大的GPU加速的張量計算(如NumPy)。2、包含自動求導系統(tǒng)的深度神經(jīng)網(wǎng)絡
    2021-10-10
  • Python設計模式行為型責任鏈模式

    Python設計模式行為型責任鏈模式

    這篇文章主要介紹了Python設計模式行為型責任鏈模式,責任鏈模式將能處理請求的對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理請求為止,避免請求的發(fā)送者和接收者之間的耦合關系,下圍繞改內容介紹具有一點的參考價值,需要的朋友可以參考下
    2022-02-02

最新評論