Python中請(qǐng)不要再用re.compile了
前言
如果大家在網(wǎng)上搜索Python 正則表達(dá)式,你將會(huì)看到大量的垃圾文章會(huì)這樣寫代碼:
import re pattern = re.compile('正則表達(dá)式') text = '一段字符串' result = pattern.findall(text)
這些文章的作者,可能是被其他語(yǔ)言的壞習(xí)慣影響了,也可能是被其他垃圾文章誤導(dǎo)了,不假思索拿來(lái)就用。
在Python里面,真的不需要使用re.compile!
為了證明這一點(diǎn),我們來(lái)看Python的源代碼。
在PyCharm里面輸入:
import re re.search
然后Windows用戶按住鍵盤上的Ctrl鍵,鼠標(biāo)左鍵點(diǎn)擊search,Mac用戶按住鍵盤上的Command鍵,鼠標(biāo)左鍵點(diǎn)擊search,PyCharm會(huì)自動(dòng)跳轉(zhuǎn)到Python的re模塊。在這里,你會(huì)看到我們常用的正則表達(dá)式方法,無(wú)論是findall還是search還是sub還是match,全部都是這樣寫的:
_compile(pattern, flag).對(duì)應(yīng)的方法(string)
例如:
def findall(pattern, string, flags=0): """Return a list of all non-overlapping matches in the string. If one or more capturing groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result.""" return _compile(pattern, flags).findall(string)
如下圖所示:
然后我們?cè)賮?lái)看compile:
def compile(pattern, flags=0): "Compile a regular expression pattern, returning a Pattern object." return _compile(pattern, flags)
如下圖所示:
看出問(wèn)題來(lái)了嗎?
我們常用的正則表達(dá)式方法,都已經(jīng)自帶了compile了!
根本沒(méi)有必要多此一舉先re.compile再調(diào)用正則表達(dá)式方法。
此時(shí),可能會(huì)有人反駁:
如果我有一百萬(wàn)條字符串,使用使用某一個(gè)正則表達(dá)式去匹配,那么我可以這樣寫代碼:
texts = [包含一百萬(wàn)個(gè)字符串的列表] pattern = re.compile('正則表達(dá)式') for text in texts: pattern.search(text)
這個(gè)時(shí)候,re.compile只執(zhí)行了1次,而如果你像下面這樣寫代碼:
texts = [包含一百萬(wàn)個(gè)字符串的列表] for text in texts: re.search('正則表達(dá)式', text)
相當(dāng)于你在底層對(duì)同一個(gè)正則表達(dá)式執(zhí)行了100萬(wàn)次re.compile。
Talk is cheap, show me the code.
我們來(lái)看源代碼,正則表達(dá)式re.compile調(diào)用的是_compile,我們就去看_compile的源代碼,如下圖所示:
紅框中的代碼,說(shuō)明了_compile自帶緩存。它會(huì)自動(dòng)儲(chǔ)存最多512條由type(pattern), pattern, flags)組成的Key,只要是同一個(gè)正則表達(dá)式,同一個(gè)flag,那么調(diào)用兩次_compile時(shí),第二次會(huì)直接讀取緩存。
綜上所述,請(qǐng)你不要再手動(dòng)調(diào)用re.compile了,這是從其他語(yǔ)言(對(duì)的,我說(shuō)的就是Java)帶過(guò)來(lái)的陋習(xí)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- 10分鐘教你用Python實(shí)現(xiàn)微信自動(dòng)回復(fù)功能
- python實(shí)現(xiàn)微信自動(dòng)回復(fù)功能
- python itchat實(shí)現(xiàn)微信自動(dòng)回復(fù)的示例代碼
- 利用python微信庫(kù)itchat實(shí)現(xiàn)微信自動(dòng)回復(fù)功能
- python實(shí)現(xiàn)微信小程序自動(dòng)回復(fù)
- python微信公眾號(hào)之關(guān)鍵詞自動(dòng)回復(fù)
- python實(shí)現(xiàn)微信機(jī)器人: 登錄微信、消息接收、自動(dòng)回復(fù)功能
- Python中re.compile函數(shù)的使用方法
- 關(guān)于Python中compile() 函數(shù)簡(jiǎn)單實(shí)用示例詳解
- Python正則表達(dá)式re.compile()和re.findall()詳解
- Python 正則 re.compile 真的必需嗎
- python內(nèi)置函數(shù)compile(),complex()的使用
相關(guān)文章
python mysql斷開重連的實(shí)現(xiàn)方法
這篇文章主要介紹了python mysql斷開重連的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07關(guān)于python實(shí)現(xiàn)常用的相似度計(jì)算方法
這篇文章主要介紹了關(guān)于python實(shí)現(xiàn)常用的相似度計(jì)算方法,最初的相似度計(jì)算是為了表征向量的重合程度的,在這里最經(jīng)典的就是余弦相似度了,當(dāng)然使用正弦或者是正切等等三角函數(shù)也都是可以的,需要的朋友可以參考下2023-07-07python實(shí)現(xiàn)sqlalchemy的使用概述
SQLAlchemy是Python中最有名的ORM工具,特點(diǎn)是操縱Python對(duì)象而不是SQL查詢,也就是在代碼層面考慮的是對(duì)象,而不是SQL,體現(xiàn)的是一種程序化思維,這樣使得Python程序更加簡(jiǎn)潔易懂,具體內(nèi)容詳情跟隨小編一起看看吧2021-08-08Python字符串本身作為bytes進(jìn)行解碼的問(wèn)題
這篇文章主要介紹了解決Python字符串本身作為bytes進(jìn)行解碼的問(wèn)題,文末給大家補(bǔ)充介紹了,Python字符串如何轉(zhuǎn)為bytes對(duì)象?Python字符串和bytes類型怎么互轉(zhuǎn),需要的朋友可以參考下2022-11-11Python Requests.post()請(qǐng)求失敗時(shí)的retry設(shè)置方式
這篇文章主要介紹了Python Requests.post()請(qǐng)求失敗時(shí)的retry設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08