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?)\])'
13 舉例
(1)匹配出文本中 "錯誤原因:" 后面的字符
pattern = r'錯誤原因:(.+)' result1 = re.search(pattern, text1) 想要的內容就是result1.group(1)
(2)匹配出 錯誤碼
import re def test_error_code_extraction(): text2 = "錯誤碼:12345,錯誤提供者:test,錯誤原因:testErrorCode:1" regex = r"(?<=錯誤碼:)\d+" print(re.search(regex, text2).group()) test_error_code_extraction()
14. AI 正在表達式生成器
https://www.agilebuilder.net/tools/app/regexp
【此網址如果,打不開,可以換個瀏覽器試下】
可以在線生成正則表達式,并且有【解析】、【用法】、【單元測試】等內容

例如

參考網址
https://zhuanlan.zhihu.com/p/479731754
https://zhuanlan.zhihu.com/p/127807805

浙公網安備 33010602011771號