新聞詳情
python教程——正則表達(dá)式發(fā)表時(shí)間:2023-05-24 17:32 正則表達(dá)式是一個(gè)特殊的字符序列,它能幫助你方便的檢查一個(gè)字符串是否與某種模式匹配。 Python 自1.5版本起增加了re 模塊,它提供 Perl 風(fēng)格的正則表達(dá)式模式。 re 模塊使 Python 語言擁有全部的正則表達(dá)式功能。 compile 函數(shù)根據(jù)一個(gè)模式字符串和可選的標(biāo)志參數(shù)生成一個(gè)正則表達(dá)式對象。該對象擁有一系列方法用于正則表達(dá)式匹配和替換。 re 模塊也提供了與這些方法功能完全一致的函數(shù),這些函數(shù)使用一個(gè)模式字符串做為它們的第一個(gè)參數(shù)。 本章節(jié)主要介紹 Python 中常用的正則表達(dá)式處理函數(shù),如果你對正則表達(dá)式不了解,可以查看我們的 正則表達(dá)式 - 教程。 re.match函數(shù) re.match 嘗試從字符串的起始位置匹配一個(gè)模式,如果不是起始位置匹配成功的話,match()就返回none。 函數(shù)語法: re.match(pattern, string, flags=0) 函數(shù)參數(shù)說明: 參數(shù)描述 pattern匹配的正則表達(dá)式 string要匹配的字符串。 flags標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。參見:正則表達(dá)式修飾符 - 可選標(biāo)志 匹配成功re.match方法返回一個(gè)匹配的對象,否則返回None。 我們可以使用group(num) 或 groups() 匹配對象函數(shù)來獲取匹配表達(dá)式。 匹配對象方法描述 group(num=0)匹配的整個(gè)表達(dá)式的字符串,group() 可以一次輸入多個(gè)組號,在這種情況下它將返回一個(gè)包含那些組所對應(yīng)值的元組。 groups()返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號。 實(shí)例 #!/usr/bin/python import re print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配 print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配 以上實(shí)例運(yùn)行輸出結(jié)果為: (0, 3) None 實(shí)例 #!/usr/bin/python3 import re line = "Cats are smarter than dogs" # .* 表示任意匹配除換行符(\n、\r)之外的任何單個(gè)或多個(gè)字符 # (.*?) 表示"非貪婪"模式,只保存第一個(gè)匹配到的子串 matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I) if matchObj: print ("matchObj.group() : ", matchObj.group()) print ("matchObj.group(1) : ", matchObj.group(1)) print ("matchObj.group(2) : ", matchObj.group(2)) else: print ("No match!!") 以上實(shí)例執(zhí)行結(jié)果如下: matchObj.group() : Cats are smarter than dogs matchObj.group(1) : Cats matchObj.group(2) : smarter re.search方法 re.search 掃描整個(gè)字符串并返回第一個(gè)成功的匹配。 函數(shù)語法: re.search(pattern, string, flags=0) 函數(shù)參數(shù)說明: 參數(shù)描述 pattern匹配的正則表達(dá)式 string要匹配的字符串。 flags標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。參見:正則表達(dá)式修飾符 - 可選標(biāo)志 匹配成功re.search方法返回一個(gè)匹配的對象,否則返回None。 我們可以使用group(num) 或 groups() 匹配對象函數(shù)來獲取匹配表達(dá)式。 匹配對象方法描述 group(num=0)匹配的整個(gè)表達(dá)式的字符串,group() 可以一次輸入多個(gè)組號,在這種情況下它將返回一個(gè)包含那些組所對應(yīng)值的元組。 groups()返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號。 實(shí)例 #!/usr/bin/python3 import re print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配 print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配 以上實(shí)例運(yùn)行輸出結(jié)果為: (0, 3) (11, 14) 實(shí)例 #!/usr/bin/python3 import re line = "Cats are smarter than dogs" searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I) if searchObj: print ("searchObj.group() : ", searchObj.group()) print ("searchObj.group(1) : ", searchObj.group(1)) print ("searchObj.group(2) : ", searchObj.group(2)) else: print ("Nothing found!!") 以上實(shí)例執(zhí)行結(jié)果如下: searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats searchObj.group(2) : smarter re.match與re.search的區(qū)別 re.match 只匹配字符串的開始,如果字符串開始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回 None,而 re.search 匹配整個(gè)字符串,直到找到一個(gè)匹配。 實(shí)例 #!/usr/bin/python3 import re line = "Cats are smarter than dogs" matchObj = re.match( r'dogs', line, re.M|re.I) if matchObj: print ("match --> matchObj.group() : ", matchObj.group()) else: print ("No match!!") matchObj = re.search( r'dogs', line, re.M|re.I) if matchObj: print ("search --> matchObj.group() : ", matchObj.group()) else: print ("No match!!") 以上實(shí)例運(yùn)行結(jié)果如下: No match!! search --> matchObj.group() : dogs 檢索和替換 Python 的re模塊提供了re.sub用于替換字符串中的匹配項(xiàng)。 語法: re.sub(pattern, repl, string, count=0, flags=0) 參數(shù): pattern : 正則中的模式字符串。 repl : 替換的字符串,也可為一個(gè)函數(shù)。 string : 要被查找替換的原始字符串。 count : 模式匹配后替換的最大次數(shù),默認(rèn) 0 表示替換所有的匹配。 flags : 編譯時(shí)用的匹配模式,數(shù)字形式。 前三個(gè)為必選參數(shù),后兩個(gè)為可選參數(shù)。 實(shí)例 #!/usr/bin/python3 import re phone = "2004-959-559 # 這是一個(gè)電話號碼" # 刪除注釋 num = re.sub(r'#.*$', "", phone) print ("電話號碼 : ", num) # 移除非數(shù)字的內(nèi)容 num = re.sub(r'\D', "", phone) print ("電話號碼 : ", num) 以上實(shí)例執(zhí)行結(jié)果如下: 電話號碼 : 2004-959-559 電話號碼 : 2004959559 repl 參數(shù)是一個(gè)函數(shù) 以下實(shí)例中將字符串中的匹配的數(shù)字乘以 2: 實(shí)例 #!/usr/bin/python import re # 將匹配的數(shù)字乘以 2 def double(matched): value = int(matched.group('value')) return str(value * 2) s = 'A23G4HFD567' print(re.sub('(?P<value>\d+)', double, s)) 執(zhí)行輸出結(jié)果為: A46G8HFD1134 compile 函數(shù) compile 函數(shù)用于編譯正則表達(dá)式,生成一個(gè)正則表達(dá)式( Pattern )對象,供 match() 和 search() 這兩個(gè)函數(shù)使用。 語法格式為: re.compile(pattern[, flags]) 參數(shù): pattern : 一個(gè)字符串形式的正則表達(dá)式 flags 可選,表示匹配模式,比如忽略大小寫,多行模式等,具體參數(shù)為: re.I 忽略大小寫 re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當(dāng)前環(huán)境 re.M 多行模式 re.S 即為' . '并且包括換行符在內(nèi)的任意字符(' . '不包括換行符) re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數(shù)據(jù)庫 re.X 為了增加可讀性,忽略空格和' # '后面的注釋 實(shí)例 實(shí)例 >>>import re >>> pattern = re.compile(r'\d+') # 用于匹配至少一個(gè)數(shù)字 >>> m = pattern.match('one12twothree34four') # 查找頭部,沒有匹配 >>> print( m ) None >>> m = pattern.match('one12twothree34four', 2, 10) # 從'e'的位置開始匹配,沒有匹配 >>> print( m ) None >>> m = pattern.match('one12twothree34four', 3, 10) # 從'1'的位置開始匹配,正好匹配 >>> print( m ) # 返回一個(gè) Match 對象 <_sre.SRE_Match object at 0x10a42aac0> >>> m.group(0) # 可省略 0 '12' >>> m.start(0) # 可省略 0 3 >>> m.end(0) # 可省略 0 5 >>> m.span(0) # 可省略 0 (3, 5) 在上面,當(dāng)匹配成功時(shí)返回一個(gè) Match 對象,其中: group([group1, …]) 方法用于獲得一個(gè)或多個(gè)分組匹配的字符串,當(dāng)要獲得整個(gè)匹配的子串時(shí),可直接使用 group() 或 group(0); start([group]) 方法用于獲取分組匹配的子串在整個(gè)字符串中的起始位置(子串第一個(gè)字符的索引),參數(shù)默認(rèn)值為 0; end([group]) 方法用于獲取分組匹配的子串在整個(gè)字符串中的結(jié)束位置(子串最后一個(gè)字符的索引+1),參數(shù)默認(rèn)值為 0; span([group]) 方法返回 (start(group), end(group))。 再看看一個(gè)例子: 實(shí)例 >>>import re >>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I 表示忽略大小寫 >>> m = pattern.match('Hello World Wide Web') >>> print( m ) # 匹配成功,返回一個(gè) Match 對象 <_sre.SRE_Match object at 0x10bea83e8> >>> m.group(0) # 返回匹配成功的整個(gè)子串 'Hello World' >>> m.span(0) # 返回匹配成功的整個(gè)子串的索引 (0, 11) >>> m.group(1) # 返回第一個(gè)分組匹配成功的子串 'Hello' >>> m.span(1) # 返回第一個(gè)分組匹配成功的子串的索引 (0, 5) >>> m.group(2) # 返回第二個(gè)分組匹配成功的子串 'World' >>> m.span(2) # 返回第二個(gè)分組匹配成功的子串索引 (6, 11) >>> m.groups() # 等價(jià)于 (m.group(1), m.group(2), ...) ('Hello', 'World') >>> m.group(3) # 不存在第三個(gè)分組 Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: no such group findall 在字符串中找到正則表達(dá)式所匹配的所有子串,并返回一個(gè)列表,如果有多個(gè)匹配模式,則返回元組列表,如果沒有找到匹配的,則返回空列表。 注意: match 和 search 是匹配一次 findall 匹配所有。 語法格式為: re.findall(pattern, string, flags=0) 或 pattern.findall(string[, pos[, endpos]]) 參數(shù): pattern 匹配模式。 string 待匹配的字符串。 pos 可選參數(shù),指定字符串的起始位置,默認(rèn)為 0。 endpos 可選參數(shù),指定字符串的結(jié)束位置,默認(rèn)為字符串的長度。 查找字符串中的所有數(shù)字: 實(shí)例 import re result1 = re.findall(r'\d+','runoob 123 google 456') pattern = re.compile(r'\d+') # 查找數(shù)字 result2 = pattern.findall('runoob 123 google 456') result3 = pattern.findall('run88oob123google456', 0, 10) print(result1) print(result2) print(result3) 輸出結(jié)果: ['123', '456'] ['123', '456'] ['88', '12'] 多個(gè)匹配模式,返回元組列表: 實(shí)例 import re result = re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10') print(result) [('width', '20'), ('height', '10')] re.finditer 和 findall 類似,在字符串中找到正則表達(dá)式所匹配的所有子串,并把它們作為一個(gè)迭代器返回。 re.finditer(pattern, string, flags=0) 參數(shù): 參數(shù)描述 pattern匹配的正則表達(dá)式 string要匹配的字符串。 flags標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。參見:正則表達(dá)式修飾符 - 可選標(biāo)志 實(shí)例 import re it = re.finditer(r"\d+","12a32bc43jf3") for match in it: print (match.group() ) 輸出結(jié)果: 12 32 43 3 re.split split 方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下: re.split(pattern, string[, maxsplit=0, flags=0]) 參數(shù): 參數(shù)描述 pattern匹配的正則表達(dá)式 string要匹配的字符串。 maxsplit分割次數(shù),maxsplit=1 分割一次,默認(rèn)為 0,不限制次數(shù)。 flags標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。參見:正則表達(dá)式修飾符 - 可選標(biāo)志 實(shí)例 >>>import re >>> re.split('\W+', 'runoob, runoob, runoob.') ['runoob', 'runoob', 'runoob', ''] >>> re.split('(\W+)', ' runoob, runoob, runoob.') ['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', ''] >>> re.split('\W+', ' runoob, runoob, runoob.', 1) ['', 'runoob, runoob, runoob.'] >>> re.split('a*', 'hello world') # 對于一個(gè)找不到匹配的字符串而言,split 不會對其作出分割 ['hello world'] 正則表達(dá)式對象 re.RegexObject re.compile() 返回 RegexObject 對象。 re.MatchObject group() 返回被 RE 匹配的字符串。 start() 返回匹配開始的位置 end() 返回匹配結(jié)束的位置 span() 返回一個(gè)元組包含匹配 (開始,結(jié)束) 的位置 |