Python 正規表示式
文章推薦指數: 80 %
正規表示式是一個特殊的字元序列,它能幫助你方便的檢查一個字串是否與某種模式匹配。
Python 自1.5版本起增加了re 模組, ...
入門教學--學的不僅是技術,更是夢想!
首頁
HTML
CSS
JavaScript
jQuery
Python3
Python2
Java
C
C++
Go
SQL
首頁
HTML
Search
Python教學
Python基礎教程
Python簡介
Python環境搭建
Python中文編碼
Python基礎語法
Python變數型別
Python運算子
Python條件語句
Python迴圈語句
PythonWhile迴圈語句
Pythonfor迴圈語句
Python迴圈巢狀
Pythonbreak語句
Pythoncontinue語句
Pythonpass語句
PythonNumber(數字)
Python字串
Python列表(List)
Python元組
Python字典(Dictionary)
Python日期和時間
Python函式
Python模組
Python檔案I/O
PythonFile(檔案)方法
Python異常處理
PythonOS檔案/目錄方法
Python內建函式
Python面向物件
Python正規表示式
PythonCGI程式設計
Python操作MySQL資料庫
Python網路程式設計
PythonSMTP傳送郵件
Python多執行緒
PythonXML解析
PythonGUI程式設計(Tkinter)
Python2.x與3.x版本區別
PythonIDE
PythonJSON
ads
HTML基礎
Python正規表示式
正規表示式是一個特殊的字元序列,它能幫助你方便的檢查一個字串是否與某種模式匹配。
Python自1.5版本起增加了re模組,它提供Perl風格的正規表示式模式。
re模組使Python語言擁有全部的正規表示式功能。
compile函式根據一個模式字串和可選的標志引數生成一個正規表示式物件。
該物件擁有一系列方法用於正規表示式匹配和替換。
re模組也提供了與這些方法功能完全一致的函式,這些函式使用一個模式字串做為它們的第一個引數。
本章節主要介紹Python中常用的正規表示式處理函式。
re.match函式
re.match嘗試從字串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。
函式語法:
re.match(pattern,string,flags=0)
函式引數說明:
引數描述
pattern匹配的正規表示式
string要匹配的字串。
flags標志位,用於控制正規表示式的匹配方式,如:是否區分大小寫,多行匹配等等。
參見:正規表示式修飾符-可選標志
匹配成功re.match方法返回一個匹配的物件,否則返回None。
我們可以使用group(num)或groups()匹配物件函式來獲取匹配表示式。
匹配物件方法描述
group(num=0)匹配的整個表示式的字串,group()可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。
groups()返回一個包含所有小組字串的元組,從1到所含的小組號。
例項
#!/usr/bin/python
#-*-coding:UTF-8-*-
importre
print(re.match('www','www.itread01.com').span())#在起始位置匹配
print(re.match('com','www.itread01.com'))#不在起始位置匹配
以上例項執行輸出結果為:
(0,3)
None
例項
#!/usr/bin/python
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!!"
以上例項執行結果如下:
matchObj.group():Catsaresmarterthandogs
matchObj.group(1):Cats
matchObj.group(2):smarter
re.search方法
re.search掃描整個字串並返回第一個成功的匹配。
函式語法:
re.search(pattern,string,flags=0)
函式引數說明:
引數描述
pattern匹配的正規表示式
string要匹配的字串。
flags標志位,用於控制正規表示式的匹配方式,如:是否區分大小寫,多行匹配等等。
匹配成功re.search方法返回一個匹配的物件,否則返回None。
我們可以使用group(num)或groups()匹配物件函式來獲取匹配表示式。
匹配物件方法描述
group(num=0)匹配的整個表示式的字串,group()可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。
groups()返回一個包含所有小組字串的元組,從1到所含的小組號。
例項
#!/usr/bin/python
#-*-coding:UTF-8-*-
importre
print(re.search('www','www.itread01.com').span())#在起始位置匹配
print(re.search('com','www.itread01.com').span())#不在起始位置匹配
以上例項執行輸出結果為:
(0,3)
(11,14)
例項
#!/usr/bin/python
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!!"
以上例項執行結果如下:
searchObj.group():Catsaresmarterthandogs
searchObj.group(1):Cats
searchObj.group(2):smarter
re.match與re.search的區別
re.match只匹配字串的開始,如果字串開始不符合正規表示式,則匹配失敗,函式返回None;而re.search匹配整個字串,直到找到一個匹配。
例項
#!/usr/bin/python
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!!"
以上例項執行結果如下:
Nomatch!!
search-->matchObj.group():dogs
檢索和替換
Python的re模組提供了re.sub用於替換字串中的匹配項。
語法:
re.sub(pattern,repl,string,count=0,flags=0)
引數:
pattern:正則中的模式字串。
repl:替換的字串,也可為一個函式。
string:要被查詢替換的原始字串。
count:模式匹配後替換的最大次數,預設0表示替換所有的匹配。
例項
#!/usr/bin/python
#-*-coding:UTF-8-*-
importre
phone="2004-959-559#這是一個國外電話號碼"
#刪除字串中的Python注釋
num=re.sub(r'#.*$',"",phone)
print"電話號碼是:",num
#刪除非數字(-)的字串
num=re.sub(r'\D',"",phone)
print"電話號碼是:",num
以上例項執行結果如下:
電話號碼是:2004-959-559
電話號碼是:2004959559
repl引數是一個函式
以下例項中將字串中的匹配的數字乘以2:
例項
#!/usr/bin/python
#-*-coding:UTF-8-*-
importre
#將匹配的數字乘以2
defdouble(matched):
value=int(matched.group('value'))
returnstr(value*2)
s='A23G4HFD567'
print(re.sub('(?P
語法格式為:
re.compile(pattern[,flags])
引數:
pattern:一個字串形式的正規表示式
flags:可選,表示匹配模式,比如忽略大小寫,多行模式等,具體引數為:
re.I忽略大小寫
re.L表示特殊字符集\w,\W,\b,\B,\s,\S依賴於當前環境
re.M多行模式
re.S即為.並且包括換行符在內的任意字元(.不包括換行符)
re.U表示特殊字符集\w,\W,\b,\B,\d,\D,\s,\S依賴於Unicode字元屬性資料庫
re.X為了增加可讀性,忽略空格和#後面的注釋
例項
例項
>>>importre
>>>pattern=re.compile(r'\d+')#用於匹配至少一個數字
>>>m=pattern.match('one12twothree34four')#查詢頭部,沒有匹配
>>>printm
None
>>>m=pattern.match('one12twothree34four',2,10)#從'e'的位置開始匹配,沒有匹配
>>>printm
None
>>>m=pattern.match('one12twothree34four',3,10)#從'1'的位置開始匹配,正好匹配
>>>printm#返回一個Match物件
<_sre.sre_matchobjectat0x10a42aac0>
>>>m.group(0)#可省略0
'12'
>>>m.start(0)#可省略0
3
>>>m.end(0)#可省略0
5
>>>m.span(0)#可省略0
(3,5)
在上面,當匹配成功時返回一個Match物件,其中:
group([group1,…])方法用於獲得一個或多個分組匹配的字串,當要獲得整個匹配的子串時,可直接使用group()或group(0);
start([group])方法用於獲取分組匹配的子串在整個字串中的起始位置(子串第一個字元的索引),引數預設值為0;
end([group])方法用於獲取分組匹配的子串在整個字串中的結束位置(子串最後一個字元的索引+1),引數預設值為0;
span([group])方法返回(start(group),end(group))。
再看看一個例子:
例項
>>>importre
>>>pattern=re.compile(r'([a-z]+)([a-z]+)',re.I)#re.I表示忽略大小寫
>>>m=pattern.match('HelloWorldWideWeb')
>>>printm#匹配成功,返回一個Match物件
<_sre.sre_matchobjectat0x10bea83e8>
>>>m.group(0)#返回匹配成功的整個子串
'HelloWorld'
>>>m.span(0)#返回匹配成功的整個子串的索引
(0,11)
>>>m.group(1)#返回第一個分組匹配成功的子串
'Hello'
>>>m.span(1)#返回第一個分組匹配成功的子串的索引
(0,5)
>>>m.group(2)#返回第二個分組匹配成功的子串
'World'
>>>m.span(2)#返回第二個分組匹配成功的子串
(6,11)
>>>m.groups()#等價於(m.group(1),m.group(2),...)
('Hello','World')
>>>m.group(3)#不存在第三個分組
Traceback(mostrecentcalllast):
File"
注意:match和search是匹配一次findall匹配所有。
語法格式為:
findall(string[,pos[,endpos]])
引數:
string:待匹配的字串。
pos:可選引數,指定字串的起始位置,預設為0。
endpos:可選引數,指定字串的結束位置,預設為字串的長度。
查詢字串中的所有數字:
例項
#-*-coding:UTF8-*-
importre
pattern=re.compile(r'\d+')#查詢數字
result1=pattern.findall('itread01123google456')
result2=pattern.findall('run88oob123google456',0,10)
print(result1)
print(result2)
輸出結果:
['123','456']
['88','12']
re.finditer
和findall類似,在字串中找到正規表示式所匹配的所有子串,並把它們作為一個迭代器返回。
re.finditer(pattern,string,flags=0)
引數:
引數描述
pattern匹配的正規表示式
string要匹配的字串。
flags標志位,用於控制正規表示式的匹配方式,如:是否區分大小寫,多行匹配等等。
參見:正規表示式修飾符-可選標志
例項
#-*-coding:UTF-8-*-
importre
it=re.finditer(r"\d+","12a32bc43jf3")
formatchinit:
print(match.group())
輸出結果:12
32
43
3
re.split
split方法按照能夠匹配的子串將字串分割後返回列表,它的使用形式如下:
re.split(pattern,string[,maxsplit=0,flags=0])
引數:
引數描述
pattern匹配的正規表示式
string要匹配的字串。
maxsplit分隔次數,maxsplit=1分隔一次,預設為0,不限制次數。
flags標志位,用於控制正規表示式的匹配方式,如:是否區分大小寫,多行匹配等等。
參見:正規表示式修飾符-可選標志
例項
>>>importre
>>>re.split('\W+','itread01,itread01,itread01.')
['itread01','itread01','itread01','']
>>>re.split('(\W+)','itread01,itread01,itread01.')
['','','itread01',',','itread01',',','itread01','.','']
>>>re.split('\W+','itread01,itread01,itread01.',1)
['','itread01,itread01,itread01.']
>>>re.split('a*','helloworld')#對於一個找不到匹配的字串而言,split不會對其作出分割
['helloworld']
正規表示式物件
re.RegexObject
re.compile()返回RegexObject物件。
re.MatchObject
group()返回被RE匹配的字串。
start()返回匹配開始的位置
end()返回匹配結束的位置
span()返回一個元組包含匹配(開始,結束)的位置
正規表示式修飾符-可選標志
正規表示式可以包含一些可選標志修飾符來控制匹配的模式。
修飾符被指定為一個可選的標志。
多個標志可以通過按位OR(|)它們來指定。
如re.I|re.M被設定成I和M標志:
修飾符描述
re.I使匹配對大小寫不敏感
re.L做本地化識別(locale-aware)匹配
re.M多行匹配,影響^和$
re.S使.匹配包括換行在內的所有字元
re.U根據Unicode字符集解析字元。
這個標志影響\w,\W,\b,\B.
re.X該標志通過給予你更靈活的格式以便你將正規表示式寫得更易於理解。
正規表示式模式
模式字串使用特殊的語法來表示一個正規表示式:
字母和數字表示他們自身。
一個正規表示式模式中的字母和數字匹配同樣的字串。
多數字母和數字前加一個反斜槓時會擁有不同的含義。
標點符號只有被轉義時才匹配自身,否則它們表示特殊的含義。
反斜槓本身需要使用反斜槓轉義。
由於正規表示式通常都包含反斜槓,所以你最好使用原始字串來表示它們。
模式元素(如r'\t',等價於'\\t')匹配相應的特殊字元。
下表列出了正規表示式模式語法中的特殊元素。
如果你使用模式的同時提供了可選的標志引數,某些模式元素的含義會改變。
模式描述
^匹配字串的開頭
$匹配字串的末尾。
.匹配任意字元,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字元。
[...]用來表示一組字元,單獨列出:[amk]匹配'a','m'或'k'
[^...]不在[]中的字元:[^abc]匹配除了a,b,c之外的字元。
re*匹配0個或多個的表示式。
re+匹配1個或多個的表示式。
re?匹配0個或1個由前面的正規表示式定義的片段,非貪婪方式
re{n}精確匹配n個前面表示式。
例如,o{2}不能匹配"Bob"中的"o",但是能匹配"food"中的兩個o。
re{n,}匹配n個前面表示式。
例如,o{2,}不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o。
"o{1,}"等價於"o+"。
"o{0,}"則等價於"o*"。
re{n,m}匹配n到m次由前面的正規表示式定義的片段,貪婪方式
a|b匹配a或b
(re)匹配括號內的表示式,也表示一個組
(?imx)正規表示式包含三種可選標志:i,m,或x。
隻影響括號中的區域。
(?-imx)正規表示式關閉i,m,或x可選標志。
隻影響括號中的區域。
(?:re)類似(...),但是不表示一個組
(?imx:re)在括號中使用i,m,或x可選標志
(?-imx:re)在括號中不使用i,m,或x可選標志
(?#...)注釋.
(?=re)前向肯定界定符。
如果所含正規表示式,以...表示,在當前位置成功匹配時成功,否則失敗。
但一旦所含表示式已經嘗試,匹配引擎根本沒有提高;模式的剩餘部分還要嘗試界定符的右邊。
(?!re)前向否定界定符。
與肯定界定符相反;當所含表示式不能在字串當前位置匹配時成功
(?>re)匹配的獨立模式,省去回溯。
\w匹配字母數字及下劃線
\W匹配非字母數字及下劃線
\s匹配任意空白字元,等價於[\t\n\r\f].
\S匹配任意非空字元
\d匹配任意數字,等價於[0-9].
\D匹配任意非數字
\A匹配字串開始
\Z匹配字串結束,如果是存在換行,只匹配到換行前的結束字串。
\z匹配字串結束
\G匹配最後匹配完成的位置。
\b匹配一個單詞邊界,也就是指單詞和空格間的位置。
例如,'er\b'可以匹配"never"中的'er',但不能匹配"verb"中的'er'。
\B匹配非單詞邊界。
'er\B'能匹配"verb"中的'er',但不能匹配"never"中的'er'。
\n,\t,等.匹配一個換行符。
匹配一個製表符。
等
\1...\9匹配第n個分組的內容。
\10匹配第n個分組的內容,如果它經匹配。
否則指的是八進位制字元碼的表示式。
正規表示式例項
字元匹配
例項描述
python匹配"python".
字元類
例項描述
[Pp]ython匹配"Python"或"python"
rub[ye]匹配"ruby"或"rube"
[aeiou]匹配中括號內的任意一個字母
[0-9]匹配任何數字。
類似於[0123456789]
[a-z]匹配任何小寫字母
[A-Z]匹配任何大寫字母
[a-zA-Z0-9]匹配任何字母及數字
[^aeiou]除了aeiou字母以外的所有字元
[^0-9]匹配除了數字外的字元
特殊字元類
例項描述
.匹配除"\n"之外的任何單個字元。
要匹配包括'\n'在內的任何字元,請使用象'[.\n]'的模式。
\d匹配一個數字字元。
等價於[0-9]。
\D匹配一個非數字字元。
等價於[^0-9]。
\s匹配任何空白字元,包括空格、製表符、換頁符等等。
等價於[\f\n\r\t\v]。
\S匹配任何非空白字元。
等價於[^\f\n\r\t\v]。
\w匹配包括下劃線的任何單詞字元。
等價於'[A-Za-z0-9_]'。
\W匹配任何非單詞字元。
等價於'[^A-Za-z0-9_]'。
分類導航
HTML/CSS
HTML教程
HTML5教程
CSS教程
CSS3教程
JavaScript
JavaScript教程
jQuery教程
Node.js教程
服務端
Python教程
Python3教程
Linux教程
Docker教程
Ruby教程
Java教程
JSP教程
C教程
C++教程
Perl教程
Go教程
PHP教程
正則表達式
資料庫
SQL教程
MySQL教程
PostgreSQL教程
SQLite教程
MongoDB教程
Redis教程
Memcached教程
行動端
IOS教程
Swift教程
Advertisement
Copyright©2016-2021IT閱讀
Itread01.comAllRightsReserved.
0.001291036605835
延伸文章資訊
- 1如何使用正規表達式— Python 3.10.5 說明文件
- 2[Day12] 字串和正規表示式 - iT 邦幫忙
幾乎所有的程式語言都提供了對正則表達式操作的支持,Python 透過re 模組支持正規表示式操作。 正規表示式中的一些基本符號進行的扼要總結。如果需要匹配的字符是正則 ...
- 3Python 速查手冊- 12.1 正規運算式re - 程式語言教學誌
Python 中做正規運算式的模組為re ,首先要設定好配對形式(pattern) 字串(string) ,然後以該配對形式字串與所欲處理之字串利用re 中相關功能的函數(function) 進...
- 4使用正規表達式re - Python 教學 - STEAM 教育學習網
正規表達式( Regualr expression ) 也可稱為正則表達式或正規表示式,是一個非常強大且實用的字串處理方法,透過正規表達式,就能定義文字規則,接著就能從一段文字裡 ...
- 5Python 正規表示式教程| D棧
pythonCopy re.match(pattern, string, flags). 它有三個引數,. pattern 是要匹配的正規表示式模式; string 是與正規表示式匹配的給定字串...