文章目錄
- 0、前言
- 1、正則表達(dá)式模式
- 2、正則表達(dá)式修飾符 – 可選標(biāo)志
-
- 2.1、`re.IGNORECASE`(`re.I`)
- 2.2、`re.ASCII`(`re.A`)
- 2.3、`re.DOTALL`(`re.S`)
- 2.4、`re.MULTILINE`(`re.M`)
- 2.5、`re.VERBOSE`(re.X)
- 2.6、修飾符的疊加
- 3、正則表達(dá)式函數(shù)
-
- 3.1、查找單個(gè)匹配項(xiàng)的函數(shù)
-
- Example 3.1.1
- Example 3.1.2
- Example 3.1.3
- 3.2、查找多個(gè)匹配項(xiàng)的函數(shù)
-
- Example 3.2.1
- 3.3、分割
-
- Example 3.3.1
import re
0、前言
本篇筆記基于菜鳥(niǎo)教程以及該知乎教程,融入了自己的一些學(xué)習(xí)心得。
1、正則表達(dá)式模式
高亮處是我的補(bǔ)充,因?yàn)楦鶕?jù)實(shí)際情況確實(shí)是能匹配到的
這邊我就偷點(diǎn)懶了哈,直接截的是菜鳥(niǎo)教程的圖。
2、正則表達(dá)式修飾符 – 可選標(biāo)志
2.1、re.IGNORECASE
(re.I
)
雖然第1節(jié)是常量,但我們必須先簡(jiǎn)要提一下re.findall
這個(gè)函數(shù),因?yàn)樗秦灤┻@一節(jié)的函數(shù)。re.findall(pattern, string, flag=0)
: 從字符串任意位置查找,返回一個(gè)列表。pattern
是欲匹配的字符(串),string
是查找源,flag
是修飾符,默認(rèn)是0
re.I
的作用是忽略字符大小寫(xiě)
text = "I'm Jasmine-Feng. My student number is No. 321432"pattern = r"Jasmine-FENG"print('Default: ', re.findall(pattern,text))print('Ignore upper/lower case: ', re.findall(pattern,text,flags=re.I))
N.B. pattern被賦了一個(gè)r字符串,這個(gè)r字符串的作用是避免轉(zhuǎn)義,r是raw的縮寫(xiě),也就是保持原樣的意思。可看這篇博文。一般來(lái)說(shuō),使用正則表達(dá)式都會(huì)用到這個(gè)r字符串。
Default: []Ignore upper/lower case: ['Jasmine-Feng']Process finished with exit code 0
在默認(rèn)情況下,區(qū)分大小寫(xiě),找不到ENG;若不區(qū)分,則可以找到eng。
2.2、re.ASCII
(re.A
)
re.A
的作用是只匹配ASCII碼支持的字符,那么具體指哪些字符呢?下圖來(lái)自百度百科。
漢字是不在這個(gè)里面的,所以如果修飾符是re.A
的話就匹配不了漢字了哈~
text = "我是Jasmine-Feng. 我的學(xué)號(hào)是No. 321432"pattern = r"w+"print('Default: ', re.findall(pattern,text))print('ASCII: ', re.findall(pattern,text,flags=re.A))
w+
的作用是匹配一個(gè)或多個(gè)字母數(shù)字下劃線漢字
Default: ['我是Jasmine', 'Feng', '我的學(xué)號(hào)是No', '321432']ASCII: ['Jasmine', 'Feng', 'No', '321432']Process finished with exit code 0
2.3、re.DOTALL
(re.S
)
在正則表達(dá)式模式中,.
是用來(lái)
text = "我t是Jasmine-Fneng. 我%的?學(xué)號(hào)是No. 321432"pattern = r'.*'print('Default: ', re.findall(pattern,text))print('DOTALL: ', re.findall(pattern,text,re.S))
.*
的作用是匹配長(zhǎng)度至少為0的字符(串),emmm,好像是句廢話?事實(shí)上,只要整段話不被換行符截?cái)?,就可以得到整個(gè)字符串(外加一個(gè)空字符串)。
Default: ['我t是Jasmine-F', '', 'eng. 我%的?學(xué)號(hào)是No. 321432', '']DOTALL: ['我t是Jasmine-Fneng. 我%的?學(xué)號(hào)是No. 321432', '']Process finished with exit code 0
2.4、re.MULTILINE
(re.M
)
$
匹配定位到字符串末尾,^
定位到字符串開(kāi)頭,默認(rèn)情況下,如果換行,是不能定位到新一行的行頭/尾的,而用re.M
修飾則可以,也就是多行模式。
text = "我t是Jasmine-Fneng. 我%的?n學(xué)號(hào)是No. 321432"pattern = r'.$'pattern2 = r'^.'print('Default, end: ', re.findall(pattern, text))print('MULTILINE, end: ', re.findall(pattern, text, re.M))print('Default, start: ', re.findall(pattern2, text))print('MULTILINE, start: ', re.findall(pattern2, text, re.M))
Default, end: ['2']MULTILINE, end: ['F', '?', '2']Default, start: ['我']MULTILINE, start: ['我', 'e', '學(xué)']Process finished with exit code 0
2.5、re.VERBOSE
(re.X)
verbose是“詳實(shí)的、冗長(zhǎng)的”意思,通過(guò)該修飾符可以在正則表達(dá)式中加入注釋。注意,是往pattern
里面加,不是往text
加!我一開(kāi)始以為是可以往text
加注釋?zhuān)缓笳{(diào)試半天都得不到結(jié)果。。。
text = '朋友們好??!我是xxxxxx拳掌門(mén)人xxx~'pattern = r'''朋友們 # 主語(yǔ) 好??! # 謂語(yǔ) '''print(re.findall(pattern, text,re.VERBOSE))
['朋友們好啊!']Process finished with exit code 0
2.6、修飾符的疊加
使用|
可以疊加修飾。
text = 'Hello everybody!n我是xxxxxx拳掌門(mén)人xxx~'pattern = r'BODY.*$'print(re.findall(pattern, text, re.I))print(re.findall(pattern, text, re.M))print(re.findall(pattern, text, re.M | re.I))
[][]['body!']Process finished with exit code 0
3、正則表達(dá)式函數(shù)
3.1、查找單個(gè)匹配項(xiàng)的函數(shù)
函數(shù) | 功能 |
---|---|
search |
從任意位置開(kāi)始搜索 |
match |
從開(kāi)頭搜索,不用完全匹配 |
fullmatch |
從開(kāi)頭搜索,必須完全匹配 |
其實(shí)我本來(lái)是寫(xiě)了自己的例子的,但是瀏覽器給我誤關(guān)了,又沒(méi)保存(心態(tài)直接炸裂