acwing week2 基礎演算法3總結 總結點1:雙指針演算法 //常用模版框架 for (int i = 0, j = 0; i < n; i ++ ) { while (j < i && check(i, j)) j ++ ; } 常見問題分類: (1) 對於一個序列,用兩個指針維護一段區間 ( ...
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