re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。
實例
#!/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!!")
以上實例運行結果如下:
No match!! search --> matchObj.group() : dogs
檢索和替換
Python 的re模塊提供了re.sub用於替換字符串中的匹配項。
語法:
re.sub(pattern, repl, string, count=0)
參數:
- pattern : 正則中的模式字符串。
- repl : 替換的字符串,也可為一個函數。
- string : 要被查找替換的原始字符串。
- count : 模式匹配后替換的最大次數,默認 0 表示替換所有的匹配。
實例
#!/usr/bin/python3 import re phone = "2004-959-559 # 這是一個電話號碼" # 刪除注釋 num = re.sub(r'#.*$', "", phone) print ("電話號碼 : ", num) # 移除非數字的內容 num = re.sub(r'\D', "", phone) print ("電話號碼 : ", num)
以上實例執行結果如下:
電話號碼 : 2004-959-559 電話號碼 : 2004959559
repl 參數是一個函數
以下實例中將字符串中的匹配的數字乘於 2:
實例
#!/usr/bin/python import re # 將匹配的數字乘於 2 def double(matched): value = int(matched.group('value')) return str(value * 2) s = 'A23G4HFD567' print(re.sub('(?P<value>\d+)', double, s))
執行輸出結果為:
A46G8HFD1134
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 為了增加可讀性,忽略空格和' # '后面的注釋
實例
實例
>>>import re >>> pattern = re.compile(r'\d+') # 用於匹配至少一個數字 >>> 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 # 返回一個 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)
在上面,當匹配成功時返回一個 Match 對象,其中:
group([group1, …])方法用於獲得一個或多個分組匹配的字符串,當要獲得整個匹配的子串時,可直接使用group()或group(0);start([group])方法用於獲取分組匹配的子串在整個字符串中的起始位置(子串第一個字符的索引),參數默認值為 0;end([group])方法用於獲取分組匹配的子串在整個字符串中的結束位置(子串最后一個字符的索引+1),參數默認值為 0;span([group])方法返回(start(group), end(group))。
再看看一個例子:
實例
>>>import re >>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I 表示忽略大小寫 >>> m = pattern.match('Hello World Wide Web') >>> print m # 匹配成功,返回一個 Match 對象 <_sre.SRE_Match object at 0x10bea83e8> >>> m.group(0) # 返回匹配成功的整個子串 'Hello World' >>> 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 (most recent call last): File "<stdin>", line 1, in <module> IndexError: no such group
findall
在字符串中找到正則表達式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
語法格式為:
findall(string[, pos[, endpos]])
參數:
- string 待匹配的字符串。
- pos 可選參數,指定字符串的起始位置,默認為 0。
- endpos 可選參數,指定字符串的結束位置,默認為字符串的長度。
查找字符串中的所有數字:
實例
import re pattern = re.compile(r'\d+') # 查找數字 result1 = pattern.findall('runoob 123 google 456') 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 | 標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。參見:正則表達式修飾符 - 可選標志 |
實例
import re it = re.finditer(r"\d+","12a32bc43jf3") for match in it: 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 | 標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。參見:正則表達式修飾符 - 可選標志 |
實例
>>>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') # 對於一個找不到匹配的字符串而言,split 不會對其作出分割 ['hello world']
