re模塊被稱為正則表達(dá)式,其作用為,創(chuàng)建一個(gè)“規(guī)則表達(dá)式”,用于驗(yàn)證和查找符合規(guī)則的文本,廣泛用于各種搜索引擎、賬戶密碼的驗(yàn)證等。
廣豐網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
預(yù)定義字符:
\d:匹配所有的十進(jìn)制數(shù)字0-9
\D:匹配所有的非數(shù)字,包含下劃線
\s:匹配所有空白字符(空格、TAB等)
\S:匹配所有非空白字符,包含下劃線
\w:匹配所有字母、漢字、數(shù)字a-z A-Z 0-9
\W:匹配所有非字母、漢字、數(shù)字,包含下劃線
特殊字符:
$:匹配一行的結(jié)尾(必須放在正則表達(dá)式最后面)
^:匹配一行的開頭(必須放在正則表達(dá)式最前面)
*:前面的字符可以出現(xiàn)0次或多次(0~無限)
+:前面的字符可以出現(xiàn)1次或多次(1~無限)
?:變"貪婪模式"為"勉強(qiáng)模式",前面的字符可以出現(xiàn)0次或1次
.:匹配除了換行符"\n"之外的任意單個(gè)字符
|:兩項(xiàng)都進(jìn)行匹配
[ ]:代表一個(gè)集合,有如下三種情況
[abc]:能匹配其中的單個(gè)字符
[a-z0-9]:能匹配指定范圍的字符,可取反(在最前面加入^)
[2-9] [1-3]:能夠做組合匹配
{ }:用于標(biāo)記前面的字符出現(xiàn)的頻率,有如下情況:
{n,m}:代表前面字符最少出現(xiàn)n次,最多出現(xiàn)m次
{n,}:代表前面字符最少出現(xiàn)n次,最多不受限制
{,m}:代表前面字符最多出現(xiàn)n次,最少不受
{n}:前面的字符必須出現(xiàn)n次
re模塊是python獨(dú)有的匹配字符串的模塊,該模塊中提供的很多功能是基于正則表達(dá)式實(shí)現(xiàn)的,
而正則表達(dá)式是對字符串進(jìn)行模糊匹配,提取自己需要的字符串部分,他對所有的語言都通用。
1、字符
2、字符集
3、量詞
貪婪模式:總是嘗試匹配盡可能多的字符
非貪婪則相反,總是嘗試匹配盡可能少的字符。
{0,} 匹配前一個(gè)字符 0 或多次,等同于 * 元字符
{+,} 匹配前一個(gè)字符 1 次或無限次,等同于 + 元字符
{0,1 }匹配前一個(gè)字符 0 次或 1 次,等同于 ? 元字符
如果 () 后面跟的是特殊元字符如 (adc)* 那么*控制的前導(dǎo)字符就是 () 里的整體內(nèi)容,不再是前導(dǎo)一個(gè)字符
4、特殊分組用法表:只對正則函數(shù)返回對象的有用
5、斷言
從斷言的表達(dá)形式可以看出,它用的就是分組符號,只不過開頭都加了一個(gè)問號,這個(gè)問號就是在說這是一個(gè)非捕獲組,這個(gè)組沒有編號,不能用來后向引用,只能當(dāng)做斷言。
匹配 titlexxx/title 中 xxx : (?=title).*(?=/title)
自己理解就是:
5、例子
(1)非
^(?!.*200).*$ ,只匹配200
^(?!.*[200|400]).*$ ,只匹配200和400
[^a-z] 反取,不含a-z字母的
(2) \u4e00-\u9fa5 中文
(3) r"\b([\u4e00-\u9fa5]\s?[\u4e00-\u9fa5]+)\b" # 小 明 匹配這種單字中間有空格的
compile 函數(shù)用于編譯正則表達(dá)式,生成一個(gè)正則表達(dá)式( Pattern )對象,供 match() 和 search() 這兩個(gè)函數(shù)使用
match 嘗試從字符串的 起始位置 匹配一個(gè)模式,如果不是起始位置匹配成功的話,返回none。
search 掃描 整個(gè)字符串 并返回 第一個(gè)成功 的匹配。
re.match與re.search的區(qū)別:
正則表達(dá)式替換函數(shù)
替換匹配成功的指定位置字符串,并且返回替換次數(shù),可以用兩個(gè)變量分別接受
(2) 兩個(gè)字符以上切割,放在 [ ] 中(不保留分隔符):
(3) 使用 ( ) 捕獲分組(保留分割符):
在字符串中找到正則表達(dá)式所匹配的所有子串,并返回一個(gè)列表,如果沒有找到匹配的,則返回空列表。
注意: match 和 search 是匹配一次 ,findall 匹配所有。
用法:
注意1:一旦匹配成,再次匹配,是從前一次匹配成功的,后面一位開始的,也可以理解為匹配成功的字符串,不在參與下次匹配
注意2:如果沒寫匹配規(guī)則,也就是空規(guī)則,返回的是一個(gè)比原始字符串多一位的,空字符串列表
注意3:正則匹配到空字符的情況,如果規(guī)則里只有一個(gè)組,而組后面是 * 就表示組里的內(nèi)容可以是 0 個(gè)或者多過,這樣組里就有了兩個(gè)意思:
一個(gè)意思是匹配組里的內(nèi)容,
二個(gè)意思是匹配組里 0 內(nèi)容(即是空白)
所以盡量避免用 * 否則會(huì)有可能匹配出空字符串
正則表達(dá)式,返回類型為表達(dá)式對象的
如:_sre.SRE_Match object; span=(6, 7), match='a'
返回對象的,需要用正則方法取字符串,
. 匹配除換行符外的任意字符
\d 匹配數(shù)字
\D 匹配非數(shù)字
\w 匹配數(shù)字字母下劃線,支持中文
\W 小寫w的反集
[abc] 匹配abc中任意一個(gè)
[a-f] 匹配字母a到f中的任意一個(gè)
x|y 匹配x或者y
^ 匹配字符串的開頭
$ 匹配字符串的結(jié)尾
{3,5} 匹配次數(shù),最少3個(gè),最多5個(gè)
{3,} 至少匹配3次
* 匹配前一個(gè)字符,0次或多次
+ 匹配前一個(gè)字符,1次或多次
? 當(dāng)前面不是數(shù)量表達(dá)式時(shí),代表匹配0次或1次
舉個(gè)栗子:
findall()函數(shù)的作用是匹配所有符合條件字符串,并以列表形式返回
由于.是匹配除換行符外的所有字符,{3,5} 匹配次數(shù),最少3個(gè),最多5個(gè),在默認(rèn)的貪婪模式下會(huì)匹配最多的字符,所以在列表中,字母a開頭的字符串后面都跟了5個(gè)字符。
可以看到在非貪婪模式下,列表中的每一項(xiàng)都匹配最少的字符數(shù)。
從前往后,匹配到符合條件的最短的每一個(gè)字符串
邊界字符:
^ 限定開頭
$ 限定結(jié)尾
匹配分組:
() 提取出來的只有括號里匹配到的部分
上文中已經(jīng)用到這個(gè)方法了,返回匹配到的字符串列表,如果沒有匹配到的內(nèi)容,則返回空列表。
flags參數(shù)是可以省略的,不省略時(shí)代表具有其他特殊的功能,如忽略大小寫,忽略換行符等,re.S代表匹配時(shí)忽略換行符
re.search()和re.findall()的參數(shù)是一樣的,只是返回結(jié)果不同,如果匹配到了,就返回該結(jié)果的正則表達(dá)式對象;如果沒有匹配到,則返回None
使用re.search()返回匹配到的第一個(gè)字符串的正則表達(dá)式對象,找到了就會(huì)停止匹配。因此這個(gè)函數(shù)比較適合在一個(gè)大文本中找第一個(gè)出現(xiàn)的字符串。
若想讓這個(gè)字符串展示出來,還需要借助group()函數(shù)。
舉個(gè)栗子:
這個(gè)函數(shù)的作用是將正則表達(dá)式編譯為一個(gè)正則表達(dá)式對象,如果要多次使用這個(gè)正則表達(dá)式的話,可以先編譯,然后復(fù)用,使程序更高效一些,對這個(gè)對象繼續(xù)使用.match(string)就可以顯示匹配到的正則表達(dá)式對象,后續(xù)如果想要獲取具體內(nèi)容的話,和上面是一眼國的,直接使用group(0)就可以啦。
如果不考慮復(fù)用的話,和re.mach(pattern, string)的效果是一樣的。
從運(yùn)行結(jié)果也可以看出,re.match()和re.search()的區(qū)別,雖然二者都會(huì)返回匹配到的正則表達(dá)式對象,但是re.match()是從字符串的最開始位置開始匹配的,如果最開始的字符不匹配則會(huì)直接返回None;而re.search()則會(huì)一直往后找,直到找到第一個(gè)符合條件的字符串。
re.sub()函數(shù)用于替換字符串中的匹配項(xiàng)
舉個(gè)栗子:
將所有數(shù)字替換為了一個(gè)空格。