正則表達(dá)式 | 代表的匹配字符 |
---|---|
[0-9] | 0123456789任意之一 |
[a-z] | 小寫字母任意之一 |
[A-Z] | 大寫字母任意之一 |
\d | 等同于[0-9] |
\D | 等同于[^0-9]匹配非數(shù)字 |
\w | 等同于[a-z0-9A-Z_]匹配大小寫字母、數(shù)字和下劃線 |
\W | 等同于[^a-z0-9A-Z_]等同于上一條取非 |
下面列舉一些正則表達(dá)式里的元字符及其作用
元字符 | 說明 |
---|---|
. | 代表任意字符 |
| | 邏輯或操作符 |
[ ] | 匹配內(nèi)部的任一字符或子表達(dá)式 |
[^] | 對字符集和取非 |
- | 定義一個區(qū)間 |
\ | 對下一字符取非(通常是普通變特殊响牛,特殊變普通) |
* | 匹配前面的字符或者子表達(dá)式0次或多次 |
*? | 惰性匹配上一個 |
+ | 匹配前一個字符或子表達(dá)式一次或多次 |
+? | 惰性匹配上一個 |
? | 匹配前一個字符或子表達(dá)式0次或1次重復(fù) |
{n} | 匹配前一個字符或子表達(dá)式 |
{m,n} | 匹配前一個字符或子表達(dá)式至少m次至多n次 |
{n,} | 匹配前一個字符或者子表達(dá)式至少n次 |
{n,}? | 前一個的惰性匹配 |
^ | 匹配字符串的開頭 |
\A | 匹配字符串開頭 |
$ | 匹配字符串結(jié)束 |
[\b] | 退格字符 |
\c | 匹配一個控制字符 |
\d | 匹配任意數(shù)字 |
\D | 匹配數(shù)字以外的字符 |
\t | 匹配制表符 |
\w | 匹配任意數(shù)字字母下劃線 |
\W | 不匹配數(shù)字字母下劃線 |
組與捕獲
-
()的作用:
1.捕獲()中正則表達(dá)式的內(nèi)容以備進(jìn)一步利用處理峰搪,可以通過在左括號后面跟隨?:來關(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.將正則表達(dá)式的一部分內(nèi)容進(jìn)行組合啤咽,以便使用量詞或者|辣卒。
-
反向引用前面()內(nèi)捕獲的內(nèi)容:
- 通過組號反向引用
每一個沒有使用?:的小括號都會分配一個組號鼓蜒,從1開始部逮,從左到右遞增醋虏,可以通過\i引用前面()內(nèi)表達(dá)式捕獲的內(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)題')] []
- 通過組名反向引用前面小括號內(nèi)捕獲的內(nèi)容
可以通過在左括號后面跟隨?P<name>,尖括號中放入組名來為一個組起一個別名,后面通過(?P=name)來引用 前面捕獲的內(nèi)容谭胚。如(? P<word>\w+)\s+(?P=word)來匹配重復(fù)的單詞徐块。
通常用在 后臺匹配url路由。
- 通過組號反向引用
注意點:反向引用不能放在字符類[]中使用灾而。
斷言與標(biāo)記
斷言不會匹配任何文本胡控,只是對斷言所在的文本施加某些約束
常用斷言 | 說明 |
---|---|
\b | 匹配單詞的邊界,放在字符類[]中則表示backspace |
\B | 匹配非單詞邊界旁趟,受ASCII標(biāo)記影響 |
\A | 在起始處匹配 |
^ | 在起始處匹配昼激,如果有MULTILINE標(biāo)志,則在每個換行符后匹配 |
\Z | 在結(jié)尾處匹配 |
$ | 在結(jié)尾處匹配锡搜,如果有MULTILINE標(biāo)志橙困,則在每個換行符前匹配 |
(?=e) | 正前瞻 |
(?!e) | 負(fù)前瞻 |
(?<=e) | 正回顧 |
(?<!e) | 負(fù)回顧 |
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 |
負(fù)前瞻 | exp1(?!exp2) | exp1后面的內(nèi)容不能匹配exp2 |
后顧: | (?<=exp2)exp1 | exp1前面的內(nèi)容要匹配exp2 |
負(fù)后顧 | (?<!exp2)exp1 | exp1前面的內(nèi)容不能匹配exp2 |
例如:我們要查找hello,但是hello后面必須是world耕餐,正則表達(dá)式可以這樣寫:"(hello)\s+(?=world)",用來匹配"hello wangxing"和"hello world"只能匹配到后者的hello
條件匹配
(?(id)yes_exp|no_exp):對應(yīng)id的子表達(dá)式如果匹配到內(nèi)容凡傅,則這里匹配yes_exp,否則匹配no_exp
正則表達(dá)式的標(biāo)志
- 正則表達(dá)式的標(biāo)志有兩種使用方法
1. 通過給compile方法傳入標(biāo)志參數(shù)肠缔,多個標(biāo)志使用|分割的方法,如re.compile(r"#[\da-f]{6}\b", re.IGNORECASE|re.MULTILINE)
2. 通過在正則表達(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 使.能匹配任意字符,包括回車
re.X或者re.VERBOSE 這樣可以在正則表達(dá)式跨越多行亚隅,也可以添加注釋硼莽,但是空白需要使用\s或者[ ]來表示,因為默認(rèn)的空白不再解釋煮纵。
本文參考