1、什麼是正則表達式?python
正則表達式(regular expression)描述了一種字符串匹配的模式,能夠用來檢查一個串是否含有某種子串、將匹配的子串作替換或者從某個串中取出符合某個條件的子串等。正則表達式
正則表達式的組件能夠是單個的字符、字符集合、字符範圍、字符間的選擇或者全部這些組件的任意組合。 express
2、正則表達式的基本語法。函數
1.備選字符集 測試
語法:[可選字符列表]
強調:1. 不管備選字符集包含多少字符,只能選1個
2. 必須選1個!
好比:6位數字的密碼: [0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]
簡化:1. 當備選字符連續時,可用-表示範圍的區間
好比:[0123456789]-->[0-9]
[0-9][0-9][0-9][0-9][0-9][0-9]
[a-z]-->1位小寫字母
[A-Z]-->1位大寫字母
[A-Za-z]-->1位字母,大小寫都行
[0-9a-zA-Z]-->1位字母或數字都行
反選:[^不能選的字符列表]
好比:[^47] 強調:^做「除了」使用時,只能放在開頭
語法:X|Y
表達式X|Y等價於[XY]
二、預約義字符集
爲經常使用的字符集專門提供的簡化寫法!
「\d」-->[0-9]-->1位數字 「\D」------一位非數字字符
「\w」-->[0-9a-zA-Z_]-->1位字母,數字或_ 「\W」------匹配任何非單詞字符,等價於[^0-9a-zA-Z_]
「\s」-->1位空字符:匹配任何空白字符,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。 「\S」--------匹配非空白字符,等價於 [^\f\n\r\t\v]
「\b」----匹配一個單詞邊界。好比,「er\b」能夠匹配"never"中的"er",但不能匹配「verb」中的「er」。 「\B」--------匹配非單詞邊界。好比,"er\B"能匹配"verb"中的"er",可是不能匹配「never」中的「er
」
「 . 「: 除換行回車外的任何一個字符,如:
.
3. 數量詞:規定相鄰的字符集可出現的次數
肯定數量:3種:
{n}--> 必須反覆出現n位
{n,m}--> 最少出現n次,最多出現m次
{n,}-->至少出現n次,多了不限!
好比:/^\d{6}$/——6位數字
不肯定數量:3種
* 大於等於0次
+ 至少出現一次
? 0次或1次
4. 指定匹配位置:
^表達式: 必須以表達式的規則爲開頭
表達式$: 必須以表達式的規則爲結尾
好比:選擇字符串開頭的空格?^\s*
選擇結尾空格?\s*$
選擇開頭或結尾的空格?^\s*|\s*$
*預告:從此只要在程序中執行驗證:都要前加^後加$*
表示從頭至尾完整匹配。
好比:test():
^\d{6}$——從頭至尾必須只能是6位數字
5.預判
在進行正式匹配正則表達式以前,先預讀整個字符串,進行初步匹配,若是預判都不能經過,則再也不驗證。ui
(?:pattern) 非獲取匹配,匹配pattern但不獲取匹配結果,不進行存儲供之後使用。這在使用或字符「(|)」來組合一個模式的各個部分時頗有用。例如「industr(?:y|ies)」就是一個比「industry|industries」更簡略的表達式。
(?=pattern) 非獲取匹配,正向確定預查,在任何匹配pattern的字符串開始處匹配查找字符串,該匹配不須要獲取供之後使用。例如,「Windows(?=95|98|NT|2000)」能匹配「Windows2000」中的「Windows」,但不能匹配「Windows3.1」中的「Windows」。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配以後當即開始下一次匹配的搜索,而不是從包含預查的字符以後開始。
(?!pattern) 非獲取匹配,正向否認預查,在任何不匹配pattern的字符串開始處匹配查找字符串,該匹配不須要獲取供之後使用。例如「Windows(?!95|98|NT|2000)」能匹配「Windows3.1」中的「Windows」,但不能匹配「Windows2000」中的「Windows」。
(?<=pattern) 非獲取匹配,反向確定預查,與正向確定預查相似,只是方向相反。例如,「(?<=95|98|NT|2000)Windows」能匹配「2000Windows」中的「Windows」,但不能匹配「3.1Windows」中的「Windows」。 「(?<=95|98|NT|2000)Windows」目前在python3.6中re模塊測試會報錯,用「|」鏈接的字符串長度必須同樣,這裏「95|98|NT」的長度都是2,「2000」的長度是4,會報錯。
(?<!pattern) 非獲取匹配,反向否認預查,與正向否認預查相似,只是方向相反。例如「(?<!95|98|NT|2000)Windows」能匹配「3.1Windows」中的「Windows」,但不能匹配「2000Windows」中的「Windows」。這個地方不正確,有問題 .此處用或任意一項都不能超過2位,如「(?<!95|98|NT|20)Windows正確,「(?<!95|980|NT|20)Windows 報錯,如果單獨使用則無限制,如(?<!2000)Windows 正確匹配。 同上,這裏在python3.6中re模塊中字符串長度要一致,並非必定爲2,好比「(?<!1995|1998|NTNT|2000)Windows」也是能夠的。
6.分組
()括號裏面的內容看成一個分組,當作一個總體
好比:(a|bc)de 表示ade 或者cdef
給分組起別名:
語法格式: (?P<name> 分組內容)
eg:(?P<mark>123abc) 這裏的意思是給123abc這個分組起了個別名叫mark
咱們能夠經過<?P=mark>的方式來訪問到該分組。
7.貪婪模式和懶惰模式
貪婪模式:默認狀況下,正則表達式會匹配最大的符合條件的字符串, *、+和?限定符都是貪婪的,由於它們會盡量多的匹配文字,只有在它們的後面加上一個?就能夠實現非貪婪或最小匹配。
好比
匹配字符串:123abc
匹配規則:r"\d*[a-z]*?" 匹配結果爲123
匹配guize:r"\d*?[a-z]*" 匹配·結果爲abc
8.python中re模塊的經常使用方法
在python中,Pattern對象沒法經過實例化來建立,只能經過re.compile()方法來返回一個pattern對象。
pattern對象,即咱們定義的匹配規則。
一、re.match(pattern,str[,flags])這個函數是從str的開頭開始,嘗試匹配pattern,一直向後匹配,若是遇到沒法匹配的字符或者到達str的末尾,馬上返回None,匹配成則返回一個match對象。
import re
s="HelloWorld"
p=re.compile(r"Hello")
m=p.match(s)
print(m.group())
print(m.span())
執行結果爲:
Hello
(0,5)
"""對於p=re.compile(r"Hello")這一語句,re.compile(r"Hello")會返回一個Pattern對象,並把這個對象的引用賦值給p這個變量,此時,p就指向了pattern這個對象"""
"""對於m=p.match(s)這一語句,p.match(s),若是存在匹配結果,則返回一個match對象,若是不存在匹配結果,則返回None"""
下面,咱們來詳細講一下Match對象中的方法
group() //返回一個字符串或者元組
span() //返回匹配規則在字符串中的位置
groups() //用於分組的數據
如今,咱們能夠知道,在Pattern中也有一個match()方法,它和re中的match()方法,做用徹底相同
參數列表 使用場景
re.match() pattern(匹配規則),str(須要匹配的字符串),flags 使用不一樣的規則去匹配字符串
p.match() str(須要匹配的字符串) 使用同一規則去匹配一組字符串
二、re.search(pattern,str[,flags])spa
search()方法與match()方法極其相似,區別在於match()方法只從str的開始位置匹配,search()方法會掃描整個str查找匹配.code
match()方法只有在str開始的位置匹配成功纔會返回一個match對象,若是不是開始位置匹配的話,match()就返回一個None。對象
search()方法的返回對象和match()返回對象是同樣的。blog
import re
s="hahhaha lalala"
p=re.compile(r"la")
m=p.match(s)
print("match對象返回結果:"+m.group())
m1=p.search(s)
print("search方法返回結果:"+m1.group())
執行結果爲:
3.findall(pattern,str[,flags])//搜索整個str,以列表的形式返回匹配的所有子串
import re
s="hahhaha lalala"
p=re.compile(r"la")print("findall對象返回結果:"+str(re.findall(p,s)))##注意findall方法返回的是一個列表
m1=p.search(s)
print("search方法返回結果:"+m1.group())
執行結果:
四、re.split(pattern,str[,maxsplit])//按照可以匹配的子串將str分割後返回列表。maxsplit用於指定最大分割次數,不指定則默認將所有分割。
import re
p=re.compile(r"\d+")
l=re.split(p,"A1B2C3D4")
print(str(l))
執行結果爲:
5.re.sub(pattern,repl,str[,count])
使用repl替換str中每個匹配的子串後返回一個被替換後的字符串。當repl是一個方法時。這個方法只接受一個參數(Match對象),並返回一個字符串。count用於指定最多替換的次數,不指定時,所有替換。