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