正則表達式
元字符
下面列舉一些正則表達式里的元字符及其作用
元字符 ? ? ? ? ? ? |說明
. ? ? ? ? ? ? ? ? ? ? |代表任意字符|
| ? ? ? ? ? ? ? ? ? ? |邏輯或操作符|
[ ] ? ? ? ? ? ? ? ? ? ? |匹配內(nèi)部的任一字符或子表達式|
[^] ? ? ? ? ? ? ? ? ? ? |對字符集和取非|
-? ? ? ? ? ? ? ? ? ? ? ? ? ? |定義一個區(qū)間|
\ ? ? ? ? ? ? ? ? ? ? |對下一字符取非(通常是普通變特殊矮固,特殊變普通)|
*? ? ? ? ? ? ? ? ? ? ? ? ? ? |匹配前面的字符或者子表達式0次或多次|
*? ? ? ? ? ? ? ? ? ? ? ? |惰性匹配上一個|
+? ? ? ? ? ? ? ? ? ? ? ? ? |匹配前一個字符或子表達式一次或多次|
+? ? ? ? ? ? ? ? ? ? ? |惰性匹配上一個|
? ? ? ? ? ? ? ? ? ? ? |匹配前一個字符或子表達式0次或1次重復(fù)|
{n} ? ? ? ? ? ? ? ? ? ? |匹配前一個字符或子表達式|
{m,n} ? ? ? ? ? ? |匹配前一個字符或子表達式至少m次至多n次|
{n,} ? ? ? ? ? ? ? ? ? ? |匹配前一個字符或者子表達式至少n次|
{n,}? ? ? ? ? ? ? |前一個的惰性匹配|
^ ? ? ? ? ? ? ? ? ? ? |匹配字符串的開頭|
\A ? ? ? ? ? ? ? ? ? ? |匹配字符串開頭|
$ ? ? ? ? ? ? ? ? ? ? |匹配字符串結(jié)束|
[\b] ? ? ? ? ? ? ? ? ? ? |退格字符|
\c ? ? ? ? ? ? ? ? ? ? |匹配一個控制字符|
\d ? ? ? ? ? ? ? ? ? ? |匹配任意數(shù)字|
\D ? ? ? ? ? ? ? ? ? ? |匹配數(shù)字以外的字符|
\t ? ? ? ? ? ? ? ? ? ? |匹配制表符|
\w ? ? ? ? ? ? ? ? ? ? |匹配任意數(shù)字字母下劃線|
\W ? ? ? ? ? ? ? ? ? ? |不匹配數(shù)字字母下劃線|
組與捕獲
1.? ()的作用:
1.捕獲()中正則表達式的內(nèi)容以備進一步利用處理,可以通過在左括號后面跟隨?:來關(guān)閉這個括號的捕獲功能
? ? ? ? import re
? ? ? ? url = 'https://113.215.20.136:9011'
? ? ? ? pattern1 = re.findall(r'(\d{1,3}\.){3}\d{1,3}',url)
? ? ? ? print(pattern1)
? ? ? ? pattern2 = re.findall(r'(?:\d{1,3}\.){3}\d{1,3}',url)
? ? ? ? print(pattern2)
? ? ? ? #運行結(jié)果
? ? ? ? ['20.']
? ? ? ? ['113.215.20.136']
? ? ? 2.將正則表達式的一部分內(nèi)容進行組合洲拇,以便使用量詞或者|。
2. 反響引用前面()內(nèi)捕獲的內(nèi)容:
? ? ? 1. 通過組號反向引用
每一個沒有使用?:的小括號都會分配一個組好蛹头,從1開始肮雨,從左到右遞增,可以通過\i引用前面()內(nèi)表達式捕獲的內(nèi)容
? ? ? import re
? ? ? strhtml1? = '<h1>這是一個標(biāo)題<h1>'
? ? ? pattern1 = re.findall(r'<h([0-9])>(.*?)<h\1>',strhtml1)
? ? ? print(pattern1)
? ? ? strhtml2? = '<h1>這是一個標(biāo)題<h3>'
? ? ? pattern2 = re.findall(r'<h([0-9])>(.*?)<h\1>',strhtml2)
? ? ? print(pattern2)
? ? ? #運行結(jié)果
? ? ? [('1', '這是一個標(biāo)題')]
? ? ? []
? ? ? 2. 通過組名反向引用前面小括號內(nèi)捕獲的內(nèi)容
可以通過在左括號后面跟隨?P<name>,尖括號中放入組名來為一個組起一個別名譬猫,后面通過(?P=name)來引用 前面捕獲的內(nèi)容拾弃。如(? P<word>\w+)\s+(?P=word)來匹配重復(fù)的單詞值桩。
通常用在 后臺匹配url路由。
3. 注意點:反向引用不能放在字符類[]中使用豪椿。
斷言與標(biāo)記
斷言不會匹配任何文本奔坟,只是對斷言所在的文本施加某些約束
常用斷言? ? ? ? ? ? ? ? ? |說明|
\b? ? ? ? ? ? ? ? ? ? ? ? ? ? |匹配單詞的邊界,放在字符類[]中則表示backspace
\B? ? ? ? ? ? ? ? ? ? ? ? ? ? |匹配非單詞邊界砂碉,受ASCII標(biāo)記影響
\A? ? ? ? ? ? ? ? ? ? ? ? ? ? |在起始處匹配
^? ? ? ? ? ? ? ? ? ? ? ? ? ? |在起始處匹配蛀蜜,如果有MULTILINE標(biāo)志,則在每個換行符后匹配
\Z? ? ? ? ? ? ? ? ? ? ? ? ? ? |在結(jié)尾處匹配
$? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |在結(jié)尾處匹配增蹭,如果有MULTILINE標(biāo)志滴某,則在每個換行符前匹配
(?=e)? ? ? ? ? ? ? ? ? ? ? ? |正前瞻
(?!e)? ? ? ? ? ? ? ? ? ? ? ? |負前瞻
(?<=e)? ? ? ? ? ? ? ? ? ? |正回顧
(?<!e)? ? ? ? ? ? ? ? ? ? ? | 負回顧
? ? import re
? ? key = r"<html><body><h1>hello world</h1></body></html>"
? ? pattern1 = re.findall(r"(?<=<h1>).+?(?=</h1>)",key)
? ? print(pattern1)
? ? #運行結(jié)果
? ? ['hello world']
? ? url = 'https://113.215.20.136:9011/113.215.6.77/'
? ? pattern = re.findall(r'(?<![\.\d])(?:\d{1,3}\.){3}\d{1,3}(?![\.\d])',url)
? ? print(pattern)
? ? #運行結(jié)果
? ? ['113.215.20.136', '113.215.6.77']
前瞻回顧的解釋
說明? ? ? ? ? ? ? ? |格式|
前瞻? ? ? ? ? ? ? ? |exp1(?=exp2) exp1后面的內(nèi)容要匹配exp2
負前瞻? ? ? ? ? ? |exp1(?!exp2) exp1后面的內(nèi)容不能匹配exp2
后顧? ? ? ? ? ? ? ? |(?<=exp2)exp1 exp1前面的內(nèi)容要匹配exp2
負后顧? ? ? ? ? ? | (?<!exp2)exp1 exp1前面的內(nèi)容不能匹配exp2
例如:我們要查找hello,但是hello后面必須是world滋迈,正則表達式可以這樣寫:"(hello)\s+(?=world)",用來匹配"hello wangxing"和"hello world"只能匹配到后者的hello
條件匹配
(?(id)yes_exp|no_exp):對應(yīng)id的子表達式如果匹配到內(nèi)容霎奢,則這里匹配yes_exp,否則匹配no_exp
正則表達式的標(biāo)志
1. 正則表達式的標(biāo)志有兩種使用方法
1. 通過給compile方法傳入標(biāo)志參數(shù)饼灿,多個標(biāo)志使用|分割的方法,如re.compile(r"#[\da-f]{6}\b", re.IGNORECASE|re.MULTILINE)
2. 通過在正則表達式前面添加(?標(biāo)志)的方法給正則表達式添加標(biāo)志表伦,如(?ms)#[\da-z]{6}\b
2. 常用的標(biāo)志
re.A或者re.ASCII嗅定, 使\b \B \s \S \w \W \d \D都假定字符串為假定字符串為ASCII
re.I或者re.IGNORECASE 使正則表達式忽略大小寫
re.M或者re.MULTILINE 多行匹配骂澄,使每個^在每個回車后摸袁,每個$在每個回車前匹配
re.S或者re.DOTALL 使.能匹配任意字符,包括回車
re.X或者re.VERBOSE 這樣可以在正則表達式跨越多行庇忌,也可以添加注釋舞箍,但是空白需要使用\s或者[ ]來表示,因為默認(rèn)的空白不再解釋皆疹。