正則表達(dá)式常見(jiàn)的4種匹配模式小結(jié)
0.寫(xiě)在前面
今天一起來(lái)學(xué)習(xí)下正則中的匹配模式,所謂的匹配模式,就是指正則中的一些 改變?cè)址ヅ湫袨?/strong> 的方式,比如匹配時(shí)不區(qū)分英文字母的大小寫(xiě)。
還記得我們?cè)诘诙恼轮袑W(xué)過(guò)的貪婪模式、非貪婪模式和獨(dú)占模式嗎,這些模式會(huì)改變正則中量詞的匹配行為,今天來(lái)看一些和量詞無(wú)關(guān)的匹配模式,一共有4種,分別是不區(qū)分大小寫(xiě)模式、點(diǎn)號(hào)通配模式、多行匹配模式、注釋模式。
1.不區(qū)分大小寫(xiě)模式
顧名思義,不區(qū)分大小寫(xiě)模式就是我想要匹配目標(biāo)字符串中的Cat,我不關(guān)心是大貓CAT,還是小貓cat,只要給我匹配上就可以了。
模式修飾符是通過(guò) (?模式標(biāo)識(shí)) 的方式來(lái)表示的,我們只需要把模式修飾符放在對(duì)應(yīng)的正則前面,就可以使用指定的模式了,
不區(qū)分大小寫(xiě)的英文是 Case-Insensitive,模式標(biāo)識(shí)用首字母的小寫(xiě)來(lái)表示就是 (?i),上面提到的栗子正則可以這么寫(xiě) (?i)cat,看下:
上一篇文章中,我們學(xué)習(xí)了分組與引用,如果匹配兩個(gè)貓就是 (?i)(cat) \1:
對(duì)應(yīng)的 Python 代碼如下:
import re result = re.findall(r"(?i)(cat) (\1)", "cat cat CAT Cat") print(result) 輸出:[('cat', 'cat'), ('CAT', 'Cat')]
可以看到,前后兩個(gè)cat大小寫(xiě)不一致,也可以匹配上,如果我們想要匹配前后大小寫(xiě)一致的貓?jiān)撛趺崔k呢,可以在外面加上一層括號(hào) ((?i)cat) \1,看下:
測(cè)試鏈接:https://regex101.com/r/tPXuGX/1
注意:在 Python 語(yǔ)言中,使用 re 庫(kù)調(diào)用上面的正則會(huì)報(bào)下面的異常,換成 regex 庫(kù)就可以,但是不能準(zhǔn)確的匹配兩個(gè)大小寫(xiě)一致的 cat。
DeprecationWarning: Flags not at the start of the expression
import regex result = regex.findall(r"((?i)cat) (\1)", "cat cat CAT Cat") print(result) 輸出:[('cat', 'cat'), ('CAT', 'Cat')]
2.點(diǎn)號(hào)通配模式
在第一篇文章中,我們學(xué)習(xí)了元字符的相關(guān)知識(shí),還記的英文的點(diǎn) . 代表什么含義嗎,它可以匹配任意字符,但是不能匹配換行。當(dāng)我們需要匹配真正的任意字符時(shí),可以使用 [\s\S] 或 [\d\D] 或 [\w\W] 等來(lái)表示。
但是這樣寫(xiě)不夠優(yōu)雅,所以正則提供了一種模式,讓英文的 . 能夠匹配上換行在內(nèi)的所有字符,這種模式就叫做點(diǎn)號(hào)通配模式。
點(diǎn)號(hào)通配模式,在很多地方被稱為單行模式,英文表示為 Single Line,取其首字母,所以單行模式對(duì)應(yīng)的修飾符是 (?s),舉個(gè)栗子:
3.多行匹配模式
在正則中 ^ 用于匹配整個(gè)目標(biāo)字符串的開(kāi)頭,$ 用戶匹配整個(gè)目標(biāo)字符串的結(jié)尾:
如果我們想要讓表達(dá)式匹配上每行的開(kāi)頭和結(jié)尾呢,多行匹配模式就上場(chǎng)了,多行的英文是 Multiline,所以多行模式對(duì)應(yīng)的修飾符是 (?m),看下效果:
4.注釋模式
當(dāng)我們寫(xiě)了一大長(zhǎng)串的表達(dá)式之后,當(dāng)時(shí)可能只有你和上帝知道它什么意思,過(guò)了半年,就只有上帝知道它什么意思了。
注釋的英文是 Comment,所以注釋模式對(duì)應(yīng)的修飾符是 (?#comment),注意沒(méi)有用首字母,還多了一個(gè) # 號(hào),拿我們之前寫(xiě)的 IPv4 地址匹配正則舉個(gè)例:
^(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?#comment IP地址第一個(gè)值)(?:\.(?:0|[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}(?#comment IP地址后三個(gè)值)$
在很多編程語(yǔ)言中也提供了 x 模式來(lái)書(shū)寫(xiě)正則,也可以起到注釋的作用,以 Python 為例:
import re regex = r'''(?mx) # 使用多行模式和x模式 ^ # 開(kāi)頭 (\d{4}) # 年 (\d{2}) # 月 $ # 結(jié)尾 ''' result = re.findall(regex, '202006\n202106') print(result) 輸出:[('2020', '06'), ('2021', '06')]
在 x 模式下,所有的換行和空格都會(huì)被忽略,如果要匹配的話,可以把換行和空格轉(zhuǎn)義,或者放在字符組中:
import re regex = r'''(?mx) # 使用多行模式和x模式 ^ # 開(kāi)頭 (\d{4}) # 年 [ ] # 空格 (\d{2}) # 月 $ # 結(jié)尾 ''' result = re.findall(regex, '2020 06\n2021 06') print(result) 輸出:[('2020', '06'), ('2021', '06')]
5.寫(xiě)在最后
最后在總結(jié)下上面講到的內(nèi)容:
正則表達(dá)式在線校驗(yàn)工具:https://regex101.com/
到此這篇關(guān)于正則表達(dá)式常見(jiàn)的4種匹配模式小結(jié)的文章就介紹到這了,更多相關(guān)正則表達(dá)式 匹配模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何實(shí)現(xiàn)正則表達(dá)式的JavaScript的代碼高亮
這篇文章主要介紹了如何實(shí)現(xiàn)正則表達(dá)式的JavaScript的代碼高亮方法,需要的朋友可以參考下2014-05-05Scala中正則表達(dá)式以及與模式匹配結(jié)合(多種方式)
這篇文章主要介紹了Scala中正則表達(dá)式以及與模式匹配結(jié)合,本文給大家介紹了多種模式匹配方式,需要的朋友可以參考下2019-06-06js中的正則表達(dá)式入門(mén)(大量實(shí)例代碼)
正則表達(dá)式(regular expression)描述了一種字符串匹配的模式,可以用來(lái)檢查一個(gè)字符串是否含有某種子串、將匹配的子串做替換或者從某個(gè)字符串中取出符合某個(gè)條件的子串等2020-04-04使用正則表達(dá)式(regex_replace)模擬讀取INI文件
這篇文章主要介紹了使用正則表達(dá)式(regex_replace)模擬讀取INI文件,需要的朋友可以參考下2017-07-07淺談js正則字面量//與new RegExp的執(zhí)行效率
以前看到很多文章都說(shuō) 字面量 會(huì)比 new 對(duì)象 形式效率高,但是在正則這里,好像不是這么回事,具體的請(qǐng)看下面的分析2020-04-04