天天看點

一起學習正規表達式(四)常見的4種比對模式0.寫在前面1.不區分大小寫模式2.點号通配模式3.多行比對模式4.注釋模式5.寫在最後

轉載請注明出處:https://blog.csdn.net/kong_gu_you_lan/article/details/119101667

本文出自 容華謝後的部落格

往期回顧:

《一起學習正規表達式(一)那些讓人頭暈的元字元》

《一起學習正規表達式(二)量詞與貪婪》

《一起學習正規表達式(三)分組與引用》

《一起學習正規表達式(四)常見的4種比對模式》

《一起學習正規表達式(五)斷言比對》

0.寫在前面

今天一起來學習下正則中的比對模式,所謂的比對模式,就是指正則中的一些 改變元字元比對行為 的方式,比如比對時不區分英文字母的大小寫。

還記得我們在第二篇文章中學過的貪婪模式、非貪婪模式和獨占模式嗎,這些模式會改變正則中量詞的比對行為,今天來看一些和量詞無關的比對模式,一共有4種,分别是不區分大小寫模式、點号通配模式、多行比對模式、注釋模式。

1.不區分大小寫模式

顧名思義,不區分大小寫模式就是我想要比對目标字元串中的Cat,我不關心是大貓CAT,還是小貓cat,隻要給我比對上就可以了。

模式修飾符是通過 (?模式辨別) 的方式來表示的,我們隻需要把模式修飾符放在對應的正則前面,就可以使用指定的模式了,

不區分大小寫的英文是 Case-Insensitive,模式辨別用首字母的小寫來表示就是 (?i),上面提到的栗子正則可以這麼寫 (?i)cat,看下:

一起學習正規表達式(四)常見的4種比對模式0.寫在前面1.不區分大小寫模式2.點号通配模式3.多行比對模式4.注釋模式5.寫在最後

上一篇文章中,我們學習了分組與引用,如果比對兩個貓就是 (?i)(cat) \1:

一起學習正規表達式(四)常見的4種比對模式0.寫在前面1.不區分大小寫模式2.點号通配模式3.多行比對模式4.注釋模式5.寫在最後

對應的 Python 代碼如下:

import re

result = re.findall(r"(?i)(cat) (\1)", "cat cat CAT Cat")
print(result)

輸出:[('cat', 'cat'), ('CAT', 'Cat')]
           

可以看到,前後兩個cat大小寫不一緻,也可以比對上,如果我們想要比對前後大小寫一緻的貓該怎麼辦呢,可以在外面加上一層括号 ((?i)cat) \1,看下:

一起學習正規表達式(四)常見的4種比對模式0.寫在前面1.不區分大小寫模式2.點号通配模式3.多行比對模式4.注釋模式5.寫在最後

測試連結:https://regex101.com/r/tPXuGX/1

注意:在 Python 語言中,使用 re 庫調用上面的正則會報下面的異常,換成 regex 庫就可以,但是不能準确的比對兩個大小寫一緻的 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.點号通配模式

在第一篇文章中,我們學習了元字元的相關知識,還記的英文的點 . 代表什麼含義嗎,它可以比對任意字元,但是不能比對換行。當我們需要比對真正的任意字元時,可以使用 [\s\S] 或 [\d\D] 或 [\w\W] 等來表示。

一起學習正規表達式(四)常見的4種比對模式0.寫在前面1.不區分大小寫模式2.點号通配模式3.多行比對模式4.注釋模式5.寫在最後

但是這樣寫不夠優雅,是以正則提供了一種模式,讓英文的 . 能夠比對上換行在内的所有字元,這種模式就叫做點号通配模式。

點号通配模式,在很多地方被稱為單行模式,英文表示為 Single Line,取其首字母,是以單行模式對應的修飾符是 (?s),舉個栗子:

一起學習正規表達式(四)常見的4種比對模式0.寫在前面1.不區分大小寫模式2.點号通配模式3.多行比對模式4.注釋模式5.寫在最後

3.多行比對模式

在正則中 ^ 用于比對整個目标字元串的開頭,$ 使用者比對整個目标字元串的結尾:

一起學習正規表達式(四)常見的4種比對模式0.寫在前面1.不區分大小寫模式2.點号通配模式3.多行比對模式4.注釋模式5.寫在最後

如果我們想要讓表達式比對上每行的開頭和結尾呢,多行比對模式就上場了,多行的英文是 Multiline,是以多行模式對應的修飾符是 (?m),看下效果:

一起學習正規表達式(四)常見的4種比對模式0.寫在前面1.不區分大小寫模式2.點号通配模式3.多行比對模式4.注釋模式5.寫在最後

4.注釋模式

當我們寫了一大長串的表達式之後,當時可能隻有你和上帝知道它什麼意思,過了半年,就隻有上帝知道它什麼意思了。

注釋的英文是 Comment,是以注釋模式對應的修飾符是 (?#comment),注意沒有用首字母,還多了一個 # 号,拿我們之前寫的 IPv4 位址比對正則舉個例:

^(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(?#comment IP位址第一個值)(?:\.(?:0|[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}(?#comment IP位址後三個值)$
           

在很多程式設計語言中也提供了 x 模式來書寫正則,也可以起到注釋的作用,以 Python 為例:

import re

regex = r'''(?mx)  # 使用多行模式和x模式
^          # 開頭
(\d{4})    # 年
(\d{2})    # 月
$          # 結尾
'''

result = re.findall(regex, '202006\n202106')
print(result)

輸出:[('2020', '06'), ('2021', '06')]
           

在 x 模式下,所有的換行和空格都會被忽略,如果要比對的話,可以把換行和空格轉義,或者放在字元組中:

import re

regex = r'''(?mx)  # 使用多行模式和x模式
^          # 開頭
(\d{4})    # 年
[ ]        # 空格
(\d{2})    # 月
$          # 結尾
'''

result = re.findall(regex, '2020 06\n2021 06')
print(result)

輸出:[('2020', '06'), ('2021', '06')]
           

5.寫在最後

最後在總結下上面講到的内容:

一起學習正規表達式(四)常見的4種比對模式0.寫在前面1.不區分大小寫模式2.點号通配模式3.多行比對模式4.注釋模式5.寫在最後

到這裡,正規表達式的4種常見比對模式就講完了,如果有問題可以給我留言評論,謝謝。

正規表達式線上校驗工具:https://regex101.com/

繼續閱讀