成都官方網(wǎng)站建設(shè)seo怎么做關(guān)鍵詞排名
Python3 正則表達(dá)式
正則表達(dá)式是一個(gè)特殊的字符序列,它能幫助你方便的檢查一個(gè)字符串是否與某種模式匹配。
Python 自1.5版本起增加了re 模塊,它提供 Perl 風(fēng)格的正則表達(dá)式模式。
re 模塊使 Python 語(yǔ)言擁有全部的正則表達(dá)式功能。
compile 函數(shù)根據(jù)一個(gè)模式字符串和可選的標(biāo)志參數(shù)生成一個(gè)正則表達(dá)式對(duì)象。該對(duì)象擁有一系列方法用于正則表達(dá)式匹配和替換。
re 模塊也提供了與這些方法功能完全一致的函數(shù),這些函數(shù)使用一個(gè)模式字符串做為它們的第一個(gè)參數(shù)。
字符與字符類
以上特殊字符要想使用字面值,必須使用\進(jìn)行轉(zhuǎn)義
字符類
- 包含在[]中的一個(gè)或者多個(gè)字符被稱為字符類,字符類在匹配時(shí)如果沒(méi)有指定量詞則只會(huì)匹配其中的一個(gè)。
- 字符類內(nèi)可以指定范圍,比如[a-zA-Z0-9]表示a到z,A到Z,0到9之間的任何一個(gè)字符
- 左方括號(hào)后跟隨一個(gè),表示否定一個(gè)字符類,比如[0-9]表示可以匹配一個(gè)任意非數(shù)字的字符。
- 字符類內(nèi)部,除了\之外,其他特殊字符不再具備特殊意義,都表示字面值。放在第一個(gè)位置表示否定,放在其他位置表示本身,-放在中間表示范圍,放在字符類中的第一個(gè)字符,則表示-本身。
- 字符類內(nèi)部可以使用速記法,比如\d \s \w
速記法
- . 可以匹配除換行符之外的任何字符,如果有re.DOTALL標(biāo)志,則匹配任意字符包括換行
- \d 匹配一個(gè)Unicode數(shù)字,如果帶re.ASCII,則匹配0-9
- \D 匹配Unicode非數(shù)字
- \s 匹配Unicode空白,如果帶有re.ASCII,則匹配\t\n\r\f\v中的一個(gè)
- \S 匹配Unicode非空白
- \w 匹配Unicode單詞字符,如果帶有re.ascii,則匹配[a-zA-Z0-9_]中的一個(gè)
- \W匹配Unicode非單子字符
量詞
- ? 匹配前面的字符0次或1次
-
- 匹配前面的字符0次或多次
-
- 匹配前面的字符1次或者多次
- {m} 匹配前面表達(dá)式m次
- {m,} 匹配前面表達(dá)式至少m次
- {,n} 匹配前面的正則表達(dá)式最多n次
- {m,n} 匹配前面的正則表達(dá)式至少m次,最多n次
注意點(diǎn):
以上量詞都是貪婪模式,會(huì)盡可能多的匹配,如果要改為非貪婪模式,通過(guò)在量詞后面跟隨一個(gè)?來(lái)實(shí)現(xiàn)
組與捕獲
()的作用:
- 捕獲()中正則表達(dá)式的內(nèi)容以備進(jìn)一步利用處理,可以通過(guò)在左括號(hào)后面跟隨?:來(lái)關(guān)閉這個(gè)括號(hào)的捕獲功能
- 將正則表達(dá)式的一部分內(nèi)容進(jìn)行組合,以便使用量詞或者|反向引用前面()內(nèi)捕獲的內(nèi)容:
- 通過(guò)組號(hào)反向引用
- 每一個(gè)沒(méi)有使用?:的小括號(hào)都會(huì)分配一個(gè)組好,從1開始,從左到右遞增,可以通過(guò)\i引用前面()內(nèi)表
達(dá)式捕獲的內(nèi)容
- 通過(guò)組名反向引用前面小括號(hào)內(nèi)捕獲的內(nèi)容
可以通過(guò)在左括號(hào)后面跟隨?P,尖括號(hào)中放入組名來(lái)為一個(gè)組起一個(gè)別名,后面通過(guò)(?P=name)來(lái)引用 前面捕獲的內(nèi)容。如(? P\w+)\s+(?P=word)來(lái)匹配重復(fù)的單詞。
注意點(diǎn):
反向引用不能放在字符類[]中使用。
斷言與標(biāo)記
斷言不會(huì)匹配任何文本,只是對(duì)斷言所在的文本施加某些約束
常用斷言:
- \b匹配單詞的邊界,放在字符類[]中則表示backspace
- \B匹配非單詞邊界,受ASCII標(biāo)記影響
- \A 在起始處匹配
- ^ 在起始處匹配,如果有MULTILINE標(biāo)志,則在每個(gè)換行符后匹配
- \Z 在結(jié)尾處匹配
- $ 在結(jié)尾處匹配,如果有MULTILINE標(biāo)志,則在每個(gè)換行符前匹配
- (?=e) 正前瞻
- (?!e) 負(fù)前瞻
- (?<=e) 正回顧
- (?<!e) 負(fù)回顧
條件匹配
(?(id)yes_exp|no_exp):對(duì)應(yīng)id的子表達(dá)式如果匹配到內(nèi)容,則這里匹配yes_exp,否則匹配no_exp
正則表達(dá)式的標(biāo)志
正則表達(dá)式的標(biāo)志有兩種使用方法
-
通過(guò)給compile方法傳入標(biāo)志參數(shù),多個(gè)標(biāo)志使用|分割的方法,如re.compile(r"#[\da-f]{6}\b", re.IGNORECASE|re.MULTILINE)
-
通過(guò)在正則表達(dá)式前面添加(?標(biāo)志)的方法給正則表達(dá)式添加標(biāo)志,如(?ms)#[\da-z]{6}\b
常用的標(biāo)志 -
re.A或者re.ASCII, 使\b \B \s \S \w \W \d \D都假定字符串為假定字符串為ASCII
-
re.I或者re.IGNORECASE 使正則表達(dá)式忽略大小寫
-
re.M或者re.MULTILINE 多行匹配,使每個(gè)^在每個(gè)回車后,每個(gè)$在每個(gè)回車前匹配
-
re.S或者re.DOTALL 使.能匹配任意字符,包括回車
-
re.X或者re.VERBOSE 這樣可以在正則表達(dá)式跨越多行,也可以添加注釋,但是空白需要使用\s或者[ ]來(lái)表示,因?yàn)槟J(rèn)的空白不再解釋。如:
re.compile(r"""<img\s +) #標(biāo)簽的開始[^>]*? #不是src的屬性src= #src屬性的開始(?:(?P<quote>["']) #左引號(hào)(?P<image_name>[^\1>]+?) #圖片名字(?P=quote) #右括號(hào)""",re.VERBOSE|re.IGNORECASE)
正則表達(dá)式處理字符串主要有四大功能
- 匹配 查看一個(gè)字符串是否符合正則表達(dá)式的語(yǔ)法,一般返回true或者false
- 獲取 正則表達(dá)式來(lái)提取字符串中符合要求的文本
- 替換 查找字符串中符合正則表達(dá)式的文本,并用相應(yīng)的字符串替換
- 分割 使用正則表達(dá)式對(duì)字符串進(jìn)行分割。
Python中re模塊使用正則表達(dá)式的兩種方法
- 使用re.compile(r, f)方法生成正則表達(dá)式對(duì)象,然后調(diào)用正則表達(dá)式對(duì)象的相應(yīng)方法。這種做法的好處是生成正則對(duì)象之后可以多次使用。
- re模塊中對(duì)正則表達(dá)式對(duì)象的每個(gè)對(duì)象方法都有一個(gè)對(duì)應(yīng)的模塊方法,唯一不同的是傳入的第一個(gè)參數(shù)是正則表達(dá)式字符串。此種方法適合于只使用一次的正則表達(dá)式。