一起學(xué)習(xí)正則表達(dá)式(三)分組與引用

思維導(dǎo)圖

轉(zhuǎn)載請(qǐng)注明出處:http://www.itdecent.cn/p/2dfa4e41203b

本文出自 容華謝后的博客

往期回顧:

《一起學(xué)習(xí)正則表達(dá)式(一)那些讓人頭暈的元字符》

《一起學(xué)習(xí)正則表達(dá)式(二)量詞與貪婪》

《一起學(xué)習(xí)正則表達(dá)式(三)分組與引用》

《一起學(xué)習(xí)正則表達(dá)式(四)常見(jiàn)的4種匹配模式》

《一起學(xué)習(xí)正則表達(dá)式(五)斷言匹配》

《一起學(xué)習(xí)正則表達(dá)式(六)正則匹配原理》

《一起學(xué)習(xí)正則表達(dá)式(七)回溯陷阱》

0.寫(xiě)在前面

今天我們來(lái)講下正則中的分組與引用,其實(shí)在第一篇文章中,我們?cè)趯?shí)戰(zhàn)環(huán)節(jié)就已經(jīng)用到分組這個(gè)功能了,回顧下 IPv4 地址的正則表達(dá)式:

^([1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.(0|[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$

可以簡(jiǎn)寫(xiě)下:

^(條件1)(\.(條件2)){3}$

可以看到在表達(dá)式中出現(xiàn)了幾對(duì)括號(hào),為什么要用括號(hào)把表達(dá)式括起來(lái),這些括號(hào)有什么作用呢,我們一起來(lái)看下。

1.分組與編號(hào)

括號(hào)在正則中可以用于分組,被括號(hào)括起來(lái)的部分可以稱為子表達(dá)式,會(huì)被保存成一個(gè)子組。

舉個(gè)栗子,有一個(gè)日期時(shí)間 2021-06-01 13:14:21,我們想要提取出其中的日期和時(shí)間,就要用括號(hào)對(duì)日期和時(shí)間進(jìn)行分組,如下圖所示:

分組與編號(hào)

可以看到圖中有兩個(gè)分組,日期分組是第1個(gè),時(shí)間分組是第2個(gè),我們以左括號(hào)的位置,來(lái)表示分組的標(biāo)號(hào),從1開(kāi)始,第幾個(gè)左括號(hào),就是第幾個(gè)分組。

上面的栗子,我們?cè)俜值募?xì)一點(diǎn),我們要分別提取其中的年、月、日,時(shí)、分、秒,如下圖所示:

括號(hào)嵌套

可以看到日期的分組編號(hào)是 1,時(shí)間分組的編號(hào)是 5,年月日的分組編號(hào)分別是 2,3,4,時(shí)分秒的分組編號(hào)分別是 6,7,8。

2.不保存子組

分組是有一定的性能消耗的,在有些情況下,我們只是單純的想要分組,后續(xù)并不想使用它,就可以在左括號(hào)的后面加上 ?: 表示不保存子組。

比如,需要是使用正則匹配目標(biāo)字符串中的15位或18位數(shù)字:

功能 正則 示例
保存子組 (正則) \d{15}(\d{3})?
不保存子組 (?:正則) \d{15}(?:\d{3})?
保存子組
不保存子組

我們之前講過(guò)的 IPv4 正則表示就可以優(yōu)化下:

^(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:0|[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$
IPv4地址正則匹配

3.分組引用

上面講完了分組,我們來(lái)看下如何來(lái)引用分組,大部分語(yǔ)言都是用 反斜杠 + 編號(hào) 的方式,個(gè)別的比如 JavaScript語(yǔ)言,使用的是 美元符號(hào) + 編號(hào) 的方式:

編程語(yǔ)言 查找時(shí)引用方式 替換時(shí)引用方式
Python \number 如 \1 \number 如 \1
Go 官方包不支持 官方包不支持
Java \number 如 \1 $number 如 $1
JavaScript $number 如 $1 $number 如 $1
PHP \number 如 \1 \number 如 \1
Ruby \number 如 \1 \number 如 \1

4.查找與替換

查找

到這里我們已經(jīng)學(xué)完了分組與引用的知識(shí),一起來(lái)實(shí)踐下,有這樣一個(gè)需求,在一個(gè)目標(biāo)字符串中,查找兩個(gè)重復(fù)出現(xiàn)的單詞。

還沒(méi)有學(xué)到單詞邊界,我們先用 \w{2,} 來(lái)表示出現(xiàn)的單詞,重復(fù)的單詞就是 (\w{2,} \1),看下結(jié)果:

分組查找

替換

上面的內(nèi)容,我們講到了日期的分組,來(lái)替換下:

分組替換

對(duì)應(yīng)的 Python 代碼如下:

import re

test_str = "2021-06-01 13:14:21"
regex = r"((\d{4})-(\d{2})-(\d{2})) ((\d{2}):(\d{2}):(\d{2}))"
subst = r"\2年\3月\4日 \6時(shí)\7分\8秒"
result = re.sub(regex, subst, test_str)
print(result)

輸出:2021年06月01日 13時(shí)14分21秒

5.在文本編輯器中使用

正則表達(dá)式不僅可以在代碼中使用,在文本編輯器中也是比較常用的,以 Sublime Text 3 舉例來(lái)講下正則的查找與替換,學(xué)完之后,會(huì)讓你的工作事半功倍。

點(diǎn)擊 Find -> Find 選項(xiàng),或者使用快捷鍵 Ctrl + F 可以喚起查找功能:

Sublime Text 查找.png

點(diǎn)擊 Find -> Replace 選項(xiàng),或者使用快捷鍵 Ctrl + H 可以喚起替換功能:

Sublime Text 替換.png

查找

我們來(lái)實(shí)現(xiàn)一個(gè)查找郵箱的功能,此處的郵件正則只是簡(jiǎn)單演示使用,當(dāng)點(diǎn)擊 Find All 按鈕后,可以看到郵箱都被找到了,此時(shí)如果點(diǎn)擊 Ctrl + C 復(fù)制,可以把找到的郵箱單獨(dú)粘貼出來(lái):

查找演示

替換

演示下我們上面講過(guò)的替換例子:

替換演示

怎么樣,是不是很方便,幾乎所有的主流編輯器都是支持正則的,學(xué)會(huì)了正則,對(duì)我們的工作幫助還是挺大的。

6.寫(xiě)在最后

最后在總結(jié)下上面講到的內(nèi)容:

思維導(dǎo)圖

到這里,正則表達(dá)式的分組與引用就講完了,如果有問(wèn)題可以給我留言評(píng)論,謝謝。

正則表達(dá)式在線校驗(yàn)工具:https://regex101.com/

最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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