Python標準庫01 正規表示式 re包

2021-07-08 16:17:21 字數 4593 閱讀 6393

摘要:python正規表示式標準庫介紹
我將從正規表示式開始講python的標準庫。正規表示式是文書處理中常用的工具,而且不需要額外的系統知識或經驗。我們會把系統相關的包放在後面講解。

正規表示式(regular expression)主要功能是從字串(string)中通過特定的模式(pattern),搜尋想要找到的內容。

之前,我們簡介了字串相關的處理函式。我們可以通過這些函式實現簡單的搜尋功能,比如說從字串「i love you」中搜尋是否有「you」這一子字串。但有些時候,我們只是模糊地知道我們想要找什麼,而不能具體說出我是在找「you」,比如說,我想找出字串中包含的數字,這些數字可以是0到9中的任何乙個。這些模糊的目標可以作為資訊寫入正規表示式,傳遞給python,從而讓python知道我們想要找的是什麼。

(官方documentation)

在python中使用正規表示式需要標準庫中的乙個包re。

1

2

3

import

re m=re

.search

('[0-9]'

,'abcd4ef'

) print(m

.group(0

))re.search()接收兩個引數,第乙個』[0-9]『就是我們所說的正規表示式,它告訴python的是,「聽著,我從字串想要找的是從0到9的乙個數字字元」。

re.search()如果從第二個引數找到符合要求的子字串,就返回乙個物件m,你可以通過m.group()的方法檢視搜尋到的結果。如果沒有找到符合要求的字元,re.search()會返回none。

如果你熟悉linux或者perl, 你應該已經熟悉正規表示式。當我們開啟linux shell的時候,可以用正規表示式去查詢或著刪除我們想要的檔案,比如說:

$rm book[0-9][0-9].txt

這就是要刪除類似於book02.txt的檔案。book[0-9][0-9].txt所包含的資訊是,以book開頭,後面跟兩個數字字元,之後跟有」.txt」的檔名。如果不符合條件的檔名,比如說:

bo12.txt

book1.txt

book99.text

都不會被選中。

perl中內建有正規表示式的功能,據說是所有正規表示式系統中最強的,這也是perl成為系統管理員利器的乙個原因。

12 m

=re.search

(pattern

,string

)# 搜尋整個字串,直到發現符合的子字串。

m=re

.match

(pattern

,string

)# 從頭開始檢查字串是否符合正規表示式。必須從字串的第乙個字元開始就相符。

可以從這兩個函式中選擇乙個進行搜尋。上面的例子中,我們如果使用re.match()的話,則會得到none,因為字串的起始為『a』, 不符合』[0-9]『的要求。

對於返回的m, 我們使用m.group()來呼叫結果。(我們會在後面更詳細解釋m.group())

我們還可以在搜尋之後將搜尋到的子字串進行替換:

1

2

str=re.

sub(

pattern

,replacement

,string

) # 在string中利用正則變換pattern進行搜尋,對於搜尋到的字串,用另一字串replacement替換。返回替換後的字串。

此外,常用的正規表示式函式還有

re.split()    # 根據正規表示式分割字串, 將分割後的所有子字串放在乙個表(list)中返回

re.findall()  # 根據正規表示式搜尋字串,將所有符合的子字串放在一給表(list)中返回

(在熟悉了上面的函式後,可以看一下re.compile(),以便於提高搜尋效率。)

關鍵在於將資訊寫成乙個正規表示式。我們先看正規表示式的常用語法:

1)單個字元:

.          任意的乙個字元

a|b        字元a或字元b

[afg]      a或者f或者g的乙個字元

[0-4]      0-4範圍內的乙個字元

[a-f]      a-f範圍內的乙個字元

[^m]       不是m的乙個字元

s         乙個空格

s         乙個非空格

d         [0-9]

d         [^0-9]

w         [0-9a-za-z]

w         [^0-9a-za-z]

2)重複

緊跟在單個字元之後,表示多個這樣類似的字元

*         重複 >=0 次

+         重複 >=1 次

?         重複 0或者1 次

重複m次。比如說 a相當於aaaa,再比如說[1-3]相當於[1-3][1-3]

重複m到n次。比如說a表示a重複2到5次。小於m次的重複,或者大於n次的重複都不符合條件。

正則表達          相符的字串舉例

[0-9]       9678

a?b              b

a+b              aaaaab

3) 位置

^         字串的起始位置

$         字串的結尾位置

正則表達          相符的字串舉例        不相符字串

^ab.*c$          abeec               cabeec (如果用re.search(), 將無法找到。)

4)返回控制

我們有可能對搜尋的結果進行進一步精簡資訊。比如下面乙個正規表示式:

output_(d)

該正規表示式用括號()包圍了乙個小的正規表示式,d。 這個小的正規表示式被用於從結果中篩選想要的資訊(在這裡是四位數字)。這樣被括號圈起來的正規表示式的一部分,稱為群(group)。

我們可以m.group(number)的方法來查詢群。group(0)是整個正則表達的搜尋結果,group(1)是第乙個群…… 1

2

3

import re

m=re

.search

("output_(d)"

,"output_1986.txt")

print(m

.group(1

))我們還可以將群命名,以便更好地使用m.group查詢:

1

2

3

import

re m=re

.search

("output_(?pd)"

,"output_1986.txt"

)#(?p...) 為group命名

print(m

.group

("year"))

re.search() re.match() re.sub() re.findall()

正規表示式構成方法

練習

有乙個檔案,檔名為output_1981.10.21.txt 。下面使用python: 讀取檔名中的日期時間資訊,並找出這一天是週幾。將檔案改名為output_yyyy-mm-dd-w.txt (yyyy:四位的年,mm:兩位的月份,dd:兩位的日,w:一位的週幾,並假設周一為一周第一天)

習題參考解答1

2

3

4

5

6

7

8

9

10

11

import re

import

datetime

m=re.

search

('output_(?pd).(?pd).(?pd)'

,'output_1981.10.21.txt')

weekday

=datetime

.datetime

(int(m

.group

('year'))

,int(m

.group

('month'))

,int(m

.group

('day'))

).strftime

("%w")

filename

='output_'+m

.group

('year')+

'-'+m.

group

('month')+

'-'+m.

group

('day')+

'-'+

weekday

+'.txt'

print

(weekday)

print

filename

Python標準庫01 正規表示式 re包

我將從正規表示式開始講python的標準庫。正規表示式是文書處理中常用的工具,而且不需要額外的系統知識或經驗。我們會把系統相關的包放在後面講解。正規表示式 regular expression 主要功能是從字串 string 中通過特定的模式 pattern 搜尋想要找到的內容。語法之前,我們簡介了...

Python標準庫01 正規表示式 re包

我將從正規表示式開始講python的標準庫。正規表示式是文書處理中常用的工具,而且不需要額外的系統知識或經驗。我們會把系統相關的包放在後面講解。正規表示式 regular expression 主要功能是從字串 string 中通過特定的模式 pattern 搜尋想要找到的內容。之前,我們簡介了字串...

轉 Python標準庫01 正規表示式 re包

我將從正規表示式開始講python的標準庫。正規表示式是文書處理中常用的工具,而且不需要額外的系統知識或經驗。我們會把系統相關的包放在後面講解。正規表示式 regular expression 主要功能是從字串 string 中通過特定的模式 pattern 搜尋想要找到的內容。之前,我們簡介了字串...