re.match與re.search的區別


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']


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM