Python正則表達式(小結)

1. 什麼是正則表達式?

正則表達式(regular expression,有時簡寫爲RegEx 或 regex)就是用一組由字母和符號組成的“表達式”來描述一個特徵,然後去驗證另一個“字符串”是否符合/匹配這個特徵。

2.應用場景?

(1)驗證字符串是否符合指定特徵,比如驗證郵件地址是否符合特定要求等;

(2)用來查找字符串,從一個長的文本中查找符合指定特徵的字符串;

(3)用來替換,比普通的替換更強大。

3.相應的模塊--re

re模塊是Python用來處理正則表達的模塊,是Python處理文本的標準庫。所謂的Python標準庫,就是內置模塊,不需要額外下載,使用時直接引入即可。

 4.常用函數

類別 函數 用途 表達式 remark
查找一個匹配項 re.search() 查找任意位置的匹配項. re.search(pattern,string,flags)

search函數是在字符串中任意位置匹配,只要有符合正則表達式的字符串就匹配成功,即使有兩個匹配項,search函數也只返回一個。

pattern: 正則表達式的字符串或原生字符串表示;string待匹配字符串;flags:正則表達式使用時的控制標記。

返回Match對象。

re.match() 必須從字符串開頭匹配. re.match(pattern,string,flags)

match函數是要從頭開始匹配,如果開頭不一樣,一定無法匹配。

從一個字符串的開始位置匹配正則表達式,返回Match對象。

pattern: 正則表達式的字符串或原生字符串表示;string待匹配字符串;flags:正則表達式使用時的控制標記。

返回Match對象。

re.fullmatch() 整個字符串與正則完全匹配.

re.fullmatch(pattern,string,flags)

fullmatch函數需要完全相同,匹配整個字符串,返回Match對象。不匹配時,返回None。

返回Match對象。

查找多個匹配項 re.findall() 從字符串任意位置查找,返回一個列表.

 re.findall(pattern,string,flags)

搜索字符串,以列表形式返回全部能匹配的子串。

返回列表類型。

兩個方法基本類似,只不過一個是返回列表,一個是返回迭代器。列表是一次性生成在內存中,而迭代器是需要使用時一點一點生成出來的,內存使用更優。
re.finditer() 從字符串任意位置查找,返回一個迭代器.

 re.finditer(pattern,string,flags)

搜索字符串,返回一個匹配結果的迭代類型,每個迭代元素是Match對象。

分割 re.re.split() 支持正則分割 re.split(pattern, string, maxsplit=0, flags=0) 

函數:將一個字符串按照正則表達式匹配結果進行分割,返回列表類型。

用 pattern 分開 string , maxsplit表示最多進行分割次數, flags表示模式。

返回列表類型。

替換 re.sub() 支持正則替換 re.sub(pattern, repl, string, count=0, flags=0)

函數:在一個字符串中替換所有匹配正則表達式的子串,返回替換後的字符串。

repl替換掉string中被pattern匹配的字符, count表示最大替換次數,flags表示正則表達式的常量。

re.subn() 支持正則替換 re.subn(pattern, repl, string, count=0, flags=0)  函數與 re.sub函數 功能一致,只不過返回一個元組 (字符串, 替換次數)。
編譯正則對象 re.compile()  編譯正則表達式  返回Pattern對象。

將正則表達式的樣式編譯爲一個 正則表達式對象 (正則對象Pattern),這個對象與re模塊有同樣的正則函數。template()增加了re.TEMPLATE 模式。

re.template()    
其他 re.escape()   re.escape(pattern) re.escape(pattern) 可以轉義正則表達式中具有特殊含義的字符,比如:.或者 *。使用是,應小心轉義符的問題。
re.purge() 清除正則表達式緩存    

注意:查找一個匹配項(search、match、fullmatch)的函數返回值都是一個 匹配對象Match ,必須需要通過match.group() 獲取匹配值。

5.什麼是Match對象?有什麼屬性和方法?

在上面4的說明中,我們提到search、match、fullmatch函數的返回值是一個Match對象,這個對象中包含了很多匹配的信息。

類別 名稱 解釋
對象屬性 string 待匹配的文本。
re 匹配時使用的Pattern對象(正則表達式)
pos 正則表達式搜索文本的開始位置。
endpos 正則表達式搜索文本的結束位置。
對象方法 start() 匹配字符串在原始字符串的開始位置。
end() 匹配字符串在原始字符串的結束位置。
span() 匹配區域,返回(start(),end())。
group() 獲得匹配後的字符串。
groups() 獲取每部分匹配的字符串,元組類型。

注意group()和groups()的區別,一個是返回匹配的字符串,一個是返回各部分匹配內容組成的元組。

6.表達式中的控制標記flags

flags:正則表達式使用時的控制標記

常用標記 標記功能說明

re.I(re.IGNORECASE)

 re.I是正則表達式中的一個flag,用於忽略大小寫。當我們想要匹配的字符串中包含大小寫不敏感的內容時,可以使用這個flag。

例如,我們想要匹配字符串中的"apple",不論是大寫還是小寫,都可以使用re.I來實現。

re.M(re.MULTILINE)

 re.M是正則表達式中的另一個flag,用於多行匹配。通常情況下,正則表達式默認只匹配字符串中的一行內容,但是當我們需要匹配多行內容時,就可以使用re.M。

例如,我們想要匹配字符串中的以數字開頭的所有行,就可以使用re.M。

re.S(re.DOTALL)  re.S是正則表達式中的一個flag,用於匹配任意字符,包括換行符。如不設置re.DOTALL這個Flag標識位,符號“.”匹配除換行符外的一切。而一旦設置了這個標識位,符號“.”將啥都匹配。
re.X(re.VERBOSE)

忽略空白,提高可讀性。當該標誌被指定時,在 RE 字符串中的空白符被忽略,除非該空白符在字符類中或在反斜槓之後。它也可以允許你將註釋寫入 RE,這些註釋會被引擎忽略;註釋用 “#”號 來標識,不過該符號不能在字符串或反斜槓之後。

7.在表達式中強調開始\結束位置的特殊字符

表達式用到的特殊字符 說明 舉例
^ 與字符串開始的地方匹配,此字符不匹配任何字符. 表達式 "^aaa" 在匹配 "xxxaaaxxx" 時,匹配失敗。只有當 "aaa" 位於字符串的開頭的時候,"^aaa" 才能匹配,如:"aaaxxxxxx"。
$ 與字符串結束的地方匹配,此字符不匹配任何字符. 達式 "aaa$"在匹配 "xxxaaaxxx" 時,匹配失敗。只有當"aaa"位於字符串的結尾的時候,"aaa$"才能匹配,比如:"xxxxxxaaa"。

8.表達式中的轉義符(\) 

一些不便書寫的字符和特殊用處的標點符號,採用在前面加“\” (轉義符).

表達式 可匹配 表達式 可匹配
\n 匹配換行符 \? 匹配?符號本身
\t 匹配製表符 \* 匹配*符號本身
\\ 匹配\符號本身 \+ 匹配+符號本身
\^ 匹配^符號本身 \{、\} 匹配大括號
\$ 匹配$符號本身 \[、\] 匹配中括號
\. 匹配.符號本身 \(、\) 匹配小括號

9.能夠與 '多種字符' 匹配的表達式

 正則表達式中的一些表示方法,可以匹配 ‘多種字符’ 中的任意一個字符。例如,表達式"\d" 可以匹配任意一個數字。雖然可以匹配其中任意字符,但是隻能是一個,不是多個。

表達式 匹配功能
\d 任意一個數字,0~9中的任意一個
\w 任意一個字母或數字或下劃線,也就是A~Z,a-z,0-9,_中任意一個
\s 包括空格\製表符\換頁符等空白符的其中的任意一個
. 小數點可以匹配除了換行符(\n)以外的任意一個字符

10.表達匹配次數

表達式 匹配功能 例子
{n} 表達式重複n次 例如:"\w{2}"相當於"\w\w";"a{5}"相當於"aaaaa"
{m,n} 表達式至少重複m次,最多重複n次 例如:"ba{1,3}" 可以匹配"ba"或"baa"或"baaa"
{m,} 表達式至少重複m次 例如:"\w\d{2,}"可以匹配"a12","_456","M12344"
? 匹配表達式0次或1次,相當於{0,1} 例如:"a[cd]?"可以匹配"a","ac","ad"
+ 表達式至少出現1次,相當於{1,} 例如:"a+b" 可以匹配"ab","aab","aaab"
* 表達式不出現或出現任意次數,相當於{0,} 例如:"\^*b"可以匹配"b","^^^b"

11.藉助[]和^自定義匹配關係

使用方括號 [ ] 包含一系列字符,能匹配其中任意一個字符。用 [^ ] 包含一系列字符,則能匹配其中字符之外的任意一個字符。

表達式案例 匹配功能
[abc5@] 匹配"a"或"b"或"5"或"@"
[^abc] 匹配"a","b","c"之外的任意一個字符
[f-k] 匹配"f"~"k"之間的任意一個字符
[^A-F0-3] 匹配"A"~"F","0"~"3"之外的任意一個字符。

注意:雖然可以匹配其中任意一個,但是隻能是一個,不是多個。 

 12.字符串中關於IP的正則表達式

    ##字符串中關於IP地址的正則表達式
    ## ^:匹配字符串的開頭。((25[0-5]|2[0-4]\d|[01]?\d\d?)\.):匹配一個數字和一個點號,這個數字的取值範圍是0到255。
    ## {3}:匹配前面的表達式三次。(25[0-5]|2[0-4]\d|[01]?\d\d?):   配一個數字,這個數字的取值範圍是0到255。$:匹配字符串的結尾。
    ## 使用正則表達式匹配IP地址
    # 字符串是IP地址
    ip_pattern = r'^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$'
    ##字符串是IP地址開頭的
    ipstart_pattern = r'^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)'
    ##字符串包含IP
    ipcontain_pattern = r'((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)'   
    ##字符串包含IP,並且IP地址是以': ['字符開頭,以']'字符結尾
    ipcontain_pattern_plus = r'(\: \[)((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\])' 

 

參考網址

https://zhuanlan.zhihu.com/p/479731754

https://zhuanlan.zhihu.com/p/127807805

https://www.bilibili.com/read/cv25901174/?jump_opus=1

https://www.bilibili.com/video/BV1TJ411Y7JX?p=156

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章