您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Python中為什么不要再用re.compile”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Python中為什么不要再用re.compile”這篇文章吧。
前言
如果大家在網(wǎng)上搜索Python 正則表達(dá)式,你將會(huì)看到大量的垃圾文章會(huì)這樣寫代碼:
import re pattern = re.compile('正則表達(dá)式') text = '一段字符串' result = pattern.findall(text)
這些文章的作者,可能是被其他語言的壞習(xí)慣影響了,也可能是被其他垃圾文章誤導(dǎo)了,不假思索拿來就用。
在Python里面,真的不需要使用re.compile!
為了證明這一點(diǎn),我們來看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á)式方法,無論是findall還是search還是sub還是match,全部都是這樣寫的:
_compile(pattern, flag).對應(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)
如下圖所示:
然后我們再來看compile:
def compile(pattern, flags=0): "Compile a regular expression pattern, returning a Pattern object." return _compile(pattern, flags)
如下圖所示:
看出問題來了嗎?
我們常用的正則表達(dá)式方法,都已經(jīng)自帶了compile了!
根本沒有必要多此一舉先re.compile再調(diào)用正則表達(dá)式方法。
此時(shí),可能會(huì)有人反駁:
如果我有一百萬條字符串,使用使用某一個(gè)正則表達(dá)式去匹配,那么我可以這樣寫代碼:
texts = [包含一百萬個(gè)字符串的列表] pattern = re.compile('正則表達(dá)式') for text in texts: pattern.search(text)
這個(gè)時(shí)候,re.compile只執(zhí)行了1次,而如果你像下面這樣寫代碼:
texts = [包含一百萬個(gè)字符串的列表] for text in texts: re.search('正則表達(dá)式', text)
相當(dāng)于你在底層對同一個(gè)正則表達(dá)式執(zhí)行了100萬次re.compile。
Talk is cheap, show me the code.
我們來看源代碼,正則表達(dá)式re.compile調(diào)用的是_compile,我們就去看_compile的源代碼,如下圖所示:
紅框中的代碼,說明了_compile自帶緩存。它會(huì)自動(dòng)儲(chǔ)存最多512條由type(pattern), pattern, flags)組成的Key,只要是同一個(gè)正則表達(dá)式,同一個(gè)flag,那么調(diào)用兩次_compile時(shí),第二次會(huì)直接讀取緩存。
綜上所述,請你不要再手動(dòng)調(diào)用re.compile了,這是從其他語言(對的,我說的就是Java)帶過來的陋習(xí)。
以上是“Python中為什么不要再用re.compile”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。