Python3常用正則表達式整理及詳解
今天扣丁學堂Python培訓給大家詳細介紹一下關(guān)于Python3正則表達式詳解,首先大多數(shù)人都知道正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。而Python自1.5版本起增加了re模塊,它提供Perl風格的正則表達式模式。
re模塊使Python語言擁有全部的正則表達式功能。
compile函數(shù)根據(jù)一個模式字符串和可選的標志參數(shù)生成一個正則表達式對象。該對象擁有一系列方法用于正則表達式匹配和替換。
re模塊也提供了與這些方法功能完全一致的函數(shù),這些函數(shù)使用一個模式字符串做為它們的第一個參數(shù)。
re.match函數(shù)
re.match嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。
函數(shù)語法:
re.match(pattern,string,flags=0)
函數(shù)參數(shù)說明:
參數(shù)描述
pattern匹配的正則表達式
string要匹配的字符串。
flags標志位,用于控制正則表達式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。
匹配成功re.match方法返回一個匹配的對象,否則返回None。
我們可以使用group(num)或groups()匹配對象函數(shù)來獲取匹配表達式。
匹配對象方法描述
group(num=0)匹配的整個表達式的字符串,group()可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應(yīng)值的元組。
groups()返回一個包含所有小組字符串的元組,從1到所含的小組號。
實例1:
#!/usr/bin/python
#-*-coding:UTF-8-*-
importre
print(re.match('www','www.runoob.com').span())#在起始位置匹配
print(re.match('com','www.runoob.com'))#不在起始位置匹配
以上實例運行輸出結(jié)果為:
(0,3)
None
實例2:
#!/usr/bin/python3
importre
line="Catsaresmarterthandogs"
matchObj=re.match(r'(.*)are(.*?).*',line,re.M|re.I)
ifmatchObj:
print("matchObj.group():",matchObj.group())
print("matchObj.group(1):",matchObj.group(1))
print("matchObj.group(2):",matchObj.group(2))
else:
print("Nomatch!!")
以上實例執(zhí)行結(jié)果如下:
matchObj.group():Catsaresmarterthandogs
matchObj.group(1):Cats
matchObj.group(2):smarter
re.search方法
re.search掃描整個字符串并返回第一個成功的匹配。
函數(shù)語法:
re.search(pattern,string,flags=0)
函數(shù)參數(shù)說明:
參數(shù)描述
pattern匹配的正則表達式
string要匹配的字符串。
flags標志位,用于控制正則表達式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。
匹配成功re.search方法返回一個匹配的對象,否則返回None。
我們可以使用group(num)或groups()匹配對象函數(shù)來獲取匹配表達式。
匹配對象方法描述
group(num=0)匹配的整個表達式的字符串,group()可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應(yīng)值的元組。
groups()返回一個包含所有小組字符串的元組,從1到所含的小組號。
實例1:
#!/usr/bin/python3
importre
print(re.search('www','www.runoob.com').span())#在起始位置匹配
print(re.search('com','www.runoob.com').span())#不在起始位置匹配
以上實例運行輸出結(jié)果為:
(0,3)
(11,14)
實例2:
#!/usr/bin/python3
importre
line="Catsaresmarterthandogs";
searchObj=re.search(r'(.*)are(.*?).*',line,re.M|re.I)
ifsearchObj:
print("searchObj.group():",searchObj.group())
print("searchObj.group(1):",searchObj.group(1))
print("searchObj.group(2):",searchObj.group(2))
else:
print("Nothingfound!!")
以上實例執(zhí)行結(jié)果如下:
searchObj.group():Catsaresmarterthandogs
searchObj.group(1):Cats
searchObj.group(2):smarter
re.match與re.search的區(qū)別
re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數(shù)返回None;而re.search匹配整個字符串,直到找到一個匹配。
實例:
#!/usr/bin/python3
importre
line="Catsaresmarterthandogs";
matchObj=re.match(r'dogs',line,re.M|re.I)
ifmatchObj:
print("match-->matchObj.group():",matchObj.group())
else:
print("Nomatch!!")
matchObj=re.search(r'dogs',line,re.M|re.I)
ifmatchObj:
print("search-->matchObj.group():",matchObj.group())
else:
print("Nomatch!!")
以上實例運行結(jié)果如下:
Nomatch!!
search-->matchObj.group():dogs
檢索和替換
Python的re模塊提供了re.sub用于替換字符串中的匹配項。
語法:
re.sub(pattern,repl,string,count=0)
參數(shù):
pattern:正則中的模式字符串。
repl:替換的字符串,也可為一個函數(shù)。
string:要被查找替換的原始字符串。
count:模式匹配后替換的最大次數(shù),默認0表示替換所有的匹配。
實例:
#!/usr/bin/python3
importre
phone="2004-959-559#這是一個電話號碼"
#刪除注釋
num=re.sub(r'#.*$',"",phone)
print("電話號碼:",num)
#移除非數(shù)字的內(nèi)容
num=re.sub(r'\D',"",phone)
print("電話號碼:",num)
以上實例執(zhí)行結(jié)果如下:
電話號碼:2004-959-559
電話號碼:2004959559
repl參數(shù)是一個函數(shù)
以下實例中將字符串中的匹配的數(shù)字乘于2:
#!/usr/bin/python
importre
#將匹配的數(shù)字乘于2
defdouble(matched):
value=int(matched.group('value'))
returnstr(value*2)
s='A23G4HFD567'
print(re.sub('(?P\d+)',double,s))
執(zhí)行輸出結(jié)果為:
A46G8HFD1134
正則表達式修飾符-可選標志
正則表達式可以包含一些可選標志修飾符來控制匹配的模式。修飾符被指定為一個可選的標志。多個標志可以通過按位OR(|)它們來指定。如re.I|re.M被設(shè)置成I和M標志:
修飾符描述
re.I使匹配對大小寫不敏感
re.L做本地化識別(locale-aware)匹配
re.M多行匹配,影響^和$
re.S使.匹配包括換行在內(nèi)的所有字符
re.U根據(jù)Unicode字符集解析字符。這個標志影響\w,\W,\b,\B.
re.X該標志通過給予你更靈活的格式以便你將正則表達式寫得更易于理解。
正則表達式模式
模式字符串使用特殊的語法來表示一個正則表達式:
字母和數(shù)字表示他們自身。一個正則表達式模式中的字母和數(shù)字匹配同樣的字符串。
多數(shù)字母和數(shù)字前加一個反斜杠時會擁有不同的含義。
標點符號只有被轉(zhuǎn)義時才匹配自身,否則它們表示特殊的含義。
反斜杠本身需要使用反斜杠轉(zhuǎn)義。
由于正則表達式通常都包含反斜杠,所以你最好使用原始字符串來表示它們。模式元素(如r'\t',等價于\\t)匹配相應(yīng)的特殊字符。
下表列出了正則表達式模式語法中的特殊元素。如果你使用模式的同時提供了可選的標志參數(shù),某些模式元素的含義會改變。
模式描述
^匹配字符串的開頭
$匹配字符串的末尾。
.匹配任意字符,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字符。
[...]用來表示一組字符,單獨列出:[amk]匹配'a','m'或'k'
[^...]不在[]中的字符:[^abc]匹配除了a,b,c之外的字符。
re*匹配0個或多個的表達式。
re+匹配1個或多個的表達式。
re?匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式
re{n}
re{n,}精確匹配n個前面表達式。
re{n,m}匹配n到m次由前面的正則表達式定義的片段,貪婪方式
a|b匹配a或b
(re)G匹配括號內(nèi)的表達式,也表示一個組
(?imx)正則表達式包含三種可選標志:i,m,或x。只影響括號中的區(qū)域。
(?-imx)正則表達式關(guān)閉i,m,或x可選標志。只影響括號中的區(qū)域。
(?:re)類似(...),但是不表示一個組
(?imx:re)在括號中使用i,m,或x可選標志
(?-imx:re)在括號中不使用i,m,或x可選標志
(?#...)注釋.
(?=re)前向肯定界定符。如果所含正則表達式,以...表示,在當前位置成功匹配時成功,否則失敗。但一旦所含表達式已經(jīng)嘗試,匹配引擎根本沒有提高;模式的剩余部分還要嘗試界定符的右邊。
(?!re)前向否定界定符。與肯定界定符相反;當所含表達式不能在字符串當前位置匹配時成功
(?>re)匹配的獨立模式,省去回溯。
\w匹配字母數(shù)字
\W匹配非字母數(shù)字
\s匹配任意空白字符,等價于[\t\n\r\f].
\S匹配任意非空字符
\d匹配任意數(shù)字,等價于[0-9].
\D匹配任意非數(shù)字
\A匹配字符串開始
\Z匹配字符串結(jié)束,如果是存在換行,只匹配到換行前的結(jié)束字符串。c
\z匹配字符串結(jié)束
\G匹配最后匹配完成的位置。
\b匹配一個單詞邊界,也就是指單詞和空格間的位置。例如,'er\b'可以匹配"never"中的'er',但不能匹配"verb"中的'er'。
\B匹配非單詞邊界。'er\B'能匹配"verb"中的'er',但不能匹配"never"中的'er'。
\n,\t,等.匹配一個換行符。匹配一個制表符。等
\1...\9匹配第n個分組的內(nèi)容。
\10匹配第n個分組的內(nèi)容,如果它經(jīng)匹配。否則指的是八進制字符碼的表達式。
正則表達式實例
字符匹配
實例描述
python匹配"python".
字符類
實例描述
[Pp]ython匹配"Python"或"python"
rub[ye]匹配"ruby"或"rube"
[aeiou]匹配中括號內(nèi)的任意一個字母
[0-9]匹配任何數(shù)字。類似于[0123456789]
[a-z]匹配任何小寫字母
[A-Z]匹配任何大寫字母
[a-zA-Z0-9]匹配任何字母及數(shù)字
[^aeiou]除了aeiou字母以外的所有字符
[^0-9]匹配除了數(shù)字外的字符
特殊字符類
實例描述
.匹配除"\n"之外的任何單個字符。要匹配包括'\n'在內(nèi)的任何字符,請使用象'[.\n]'的模式。
\d匹配一個數(shù)字字符。等價于[0-9]。
\D匹配一個非數(shù)字字符。等價于[^0-9]。
\s匹配任何空白字符,包括空格、制表符、換頁符等等。等價于[\f\n\r\t\v]。
\S匹配任何非空白字符。等價于[^\f\n\r\t\v]。
\w匹配包括下劃線的任何單詞字符。等價于'[A-Za-z0-9_]'。
\W匹配任何非單詞字符。等價于'[^A-Za-z0-9_]'。
以上就是關(guān)于扣丁學堂Python中常用的正則表達式處理函數(shù)的詳細介紹,最后想要學好Python開發(fā)技術(shù)高薪就業(yè)的小伙伴就選擇扣丁學堂進行學習吧,扣丁學堂不僅有專業(yè)的老師和與時俱進的課程體系,還有大量的Python視頻教程供學員觀看學習,選擇扣丁學堂助你輕松高薪就業(yè)??鄱W堂Python技術(shù)交流群:816572891。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。