3.3.4 非捕獲型分組

目前為止,總共介紹了括號(hào)的三種用途:

  • 分組:將相關(guān)的元素歸攏到一起,構(gòu)成單個(gè)元素;
  • 多選結(jié)構(gòu):規(guī)定可能出現(xiàn)的多個(gè)子表達(dá)式;
  • 引用分組:將子表達(dá)式匹配的文本存儲(chǔ)起來,供之后引用

這三種用途并不是彼此獨(dú)立的,而是相互重疊的:

  • 單純的分組可以視為“只包含一個(gè)多選分支的多選結(jié)構(gòu)”;
  • 整個(gè)多選結(jié)構(gòu)也會(huì)被視為單個(gè)元素,可以由一個(gè)量詞限定;
  • 只要出現(xiàn)了括號(hào),正則表達(dá)式在匹配時(shí)就會(huì)把括號(hào)內(nèi)的子表達(dá)式存儲(chǔ)起來提供引用;

但有時(shí)如果不需要引用,保存括號(hào)分組的引用信息就會(huì)影響性能;如果表達(dá)式比較復(fù)雜,要處理的文本又很多,更可能嚴(yán)重影響性能。

為了解決這種問題,正則表達(dá)式提供了非捕獲分組(non-capturing group)。非捕獲分組類似普通捕獲分組,只是在開括號(hào)后面緊跟一個(gè)問號(hào)和冒號(hào)(?:...),這樣的括號(hào)叫做非捕獲型括號(hào),它只能限定量詞的作用范圍,不能捕獲文本。在引用分組時(shí),分組的編號(hào)同樣會(huì)按開括號(hào)出現(xiàn)的順序從左向右遞增,只是必須以捕獲分組為準(zhǔn),非捕獲分組會(huì)略過。

例3-35 非捕獲型分組的使用

# 非捕獲型分組
print(re.search(r'(\d{4})-(\d{2})-(\d{2})', '2018-12-20').group(1))  # 2018
print(re.search(r'(?:\d{4})-(\d{2})-(\d{2})', '2018-12-20').group(1))  # 12

非捕獲型分組不需要保存匹配的文本,整個(gè)表達(dá)式的效率也因此提高,但是看起來不如捕獲分組美觀。不過,如果只需要使用括號(hào)的分組或者讀選結(jié)構(gòu)的功能,而沒有用到引用分組,則應(yīng)當(dāng)盡量使用非捕獲型括號(hào)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 正則表達(dá)式有很多流派,也有很多的特性,不同的語言支持度也是不一樣的。本篇文章是寫Python中的正則表達(dá)式的用法的...
    Moscow1147閱讀 1,201評(píng)論 0 0
  • 個(gè)人根據(jù)《正則指引》內(nèi)容總結(jié)記錄,侵刪?。?轉(zhuǎn)載至我的博客 最近看了編譯原理方面的書,覺得正則表達(dá)式非常重要,在各...
    J退後閱讀 650評(píng)論 0 0
  • 初衷:看了很多視頻、文章,最后卻通通忘記了,別人的知識(shí)依舊是別人的,自己卻什么都沒獲得。此系列文章旨在加深自己的印...
    DCbryant閱讀 4,222評(píng)論 0 20
  • 構(gòu)建掃描器程序的兩個(gè)重要方法 boolean hitEnd() 返回true,說明結(jié)尾有更多的字符可能會(huì)改變本次的...
    mxl0814閱讀 672評(píng)論 0 1
  • 今年兒子放暑假那會(huì),我剛剛學(xué)會(huì)在網(wǎng)上買火車票,以前都是兒子給買,用智行購票軟件,還沒來得及沾沾自喜,就出了一件糗事...
    歲月靜好如詩閱讀 570評(píng)論 2 5

友情鏈接更多精彩內(nèi)容