Python 正規表示式

文章推薦指數: 80 %
投票人數:10人

正規表示式是一個特殊的字元序列,它能幫助你方便的檢查一個字串是否與某種模式匹配。

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\d+)',double,s)) 執行輸出結果為: A46G8HFD1134 re.compile函式 compile函式用於編譯正規表示式,生成一個正規表示式(Pattern)物件,供match()和search()這兩個函式使用。

語法格式為: 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"",line1,in IndexError:nosuchgroup findall 在字串中找到正規表示式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。

注意: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



請為這篇文章評分?