Python3 正則表達式

Python 編譯器 Line Perl java丶python攻城獅 2019-06-18

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

Python 自1.5版本起增加了re 模塊,它提供 Perl 風格的正則表達式模式。

re 模塊使 Python 語言擁有全部的正則表達式功能。

compile 函數根據一個模式字符串和可選的標誌參數生成一個正則表達式對象。該對象擁有一系列方法用於正則表達式匹配和替換。

re 模塊也提供了與這些方法功能完全一致的函數,這些函數使用一個模式字符串做為它們的第一個參數。

本章節主要介紹 Python 中常用的正則表達式處理函數


re.match函數

re.match 嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。

函數語法


re.match(pattern, string, flags=0)

函數參數說明:


Python3 正則表達式


匹配成功re.match方法返回一個匹配的對象,否則返回None。

我們可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。


Python3 正則表達式


實例


#!/usr/bin/python
import re
print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.match('com', 'www.runoob.com')) # 不在起始位置匹

以上實例運行輸出結果為:


(0, 3)None

實例



#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
# .* 表示任意匹配除換行符(\n、\r)之外的任何單個或多個字符
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!!")

以上實例執行結果如下:


matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter

re.search方法

re.search 掃描整個字符串並返回第一個成功的匹配。

函數語法:


re.search(pattern, string, flags=0)

函數參數說明:


Python3 正則表達式


匹配成功re.search方法返回一個匹配的對象,否則返回None。

我們可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。


Python3 正則表達式


實例


#!/usr/bin/python3
import re
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配

以上實例運行輸出結果為:


(0, 3)(11, 14)

實例


#!/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!!")

以上實例執行結果如下:


searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarter

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, flags=0)

參數:

  • pattern : 正則中的模式字符串。
  • repl : 替換的字符串,也可為一個函數。
  • string : 要被查找替換的原始字符串。
  • count : 模式匹配後替換的最大次數,默認 0 表示替換所有的匹配。
  • flags : 編譯時用的匹配模式,數字形式。

前三個為必選參數,後兩個為可選參數。

實例


#!/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_Matchobject 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 at0x10bea83e8>
>>> 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 (mostrecent 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)

參數:


Python3 正則表達式


實例


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

參數:


Python3 正則表達式


實例


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

正則表達式對象

re.RegexObject

re.compile() 返回 RegexObject 對象。

re.MatchObject

group() 返回被 RE 匹配的字符串。

  • start() 返回匹配開始的位置
  • end() 返回匹配結束的位置
  • span() 返回一個元組包含匹配 (開始,結束) 的位置

正則表達式修飾符 - 可選標誌

正則表達式可以包含一些可選標誌修飾符來控制匹配的模式。修飾符被指定為一個可選的標誌。多個標誌可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設置成 I 和 M 標誌:


Python3 正則表達式



正則表達式模式

模式字符串使用特殊的語法來表示一個正則表達式:

字母和數字表示他們自身。一個正則表達式模式中的字母和數字匹配同樣的字符串。

多數字母和數字前加一個反斜槓時會擁有不同的含義。

標點符號只有被轉義時才匹配自身,否則它們表示特殊的含義。

反斜槓本身需要使用反斜槓轉義。

由於正則表達式通常都包含反斜槓,所以你最好使用原始字符串來表示它們。模式元素(如 r'\t',等價於 \\t )匹配相應的特殊字符。

下表列出了正則表達式模式語法中的特殊元素。如果你使用模式的同時提供了可選的標誌參數,某些模式元素的含義會改變。


Python3 正則表達式


Python3 正則表達式



正則表達式實例

字符匹配


Python3 正則表達式


字符類


Python3 正則表達式


特殊字符類


Python3 正則表達式


好了,本文就給大夥分享到這裡,文末分享一波福利

Python3 正則表達式

Python3 正則表達式

獲取方式:關注+私信我“python資料”即可獲取以上資源!

相關推薦

推薦中...