1. 程式人生 > 實用技巧 >Python的正則表示式(re包)

Python的正則表示式(re包)

1.正則表示式的模式

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}       重複m次。比如說 a{4}相當於aaaa,再比如說[1-3]{2}相當於[1-3][1-3]

{m, n}    重複m到n次。比如說a{2, 5}表示a重複2到5次。小於m次的重複,或者大於n次的重複都不符合條件。
正則表達          相符的字串舉例

[0-9]{3,5}       9678

a?b              b

a+b              aaaaab

3) 位置

^         字串的起始位置

$         字串的結尾位置
正則表達          相符的字串舉例        不相符字串

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

4)返回控制

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

output_(\d{4})

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

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

import re
m = re.search("output_(\d{4})", "output_1986.txt")
print(m.group(1))

2.正則表示式的函式

1)re.match函式

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

語法:

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

程式碼示例:

line = "Cats are smarter than dogs"
matchObj = re.match(r'(.*) are (.*?) .*', line)
print( matchObj.group())
print( matchObj.group(1))
print( matchObj.group(1,2))

Cats are smarter than dogs
Cats
('Cats', 'smarter')

2)re.search函式

re.search 掃描整個字串並返回第一個成功的匹配。匹配成功re.search方法返回一個匹配的物件,否則返回None。

語法:

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

程式碼示例:

line = "Cats are smarter than dogs"
matchObj = re.search(r'(.*) are (.*?) .*', line)
print( matchObj.group())
print( matchObj.group(1))
print( matchObj.group(1,2))

Cats are smarter than dogs
Cats
('Cats', 'smarter')

re.match與re.search的區別:
re.match只匹配字串的開始,如果字串開始不符合正則表示式,則匹配失敗,函式返回None;而re.search匹配整個字串,直到找到一個匹配,如果完全匹配不上,則返回None。

3)re.sub()函式

用於替換字串中的匹配項。

語法:

re.sub(pattern, repl, string, count=0, flags=0)

其中
count : 模式匹配後替換的最大次數,預設 0 表示替換所有的匹配。
程式碼示例:

import re
phone = "2004-959-559 # 這是一個國外電話號碼"
# 刪除字串中的 Python註釋
num = re.sub(r'#.*$', "", phone)
print("電話號碼是: ", num) # 電話號碼是:  2004-959-559
 
# 刪除非數字(-)的字串
num2 = re.sub(r'\D', "", phone,2) # \D表示非數字,替換兩次
num = re.sub(r'\D', "", phone) # \D表示非數字,全部替換
print("電話號碼是 : ", num2) # 電話號碼是 :  2004959559 # 這是一個國外電話號碼
print("電話號碼是 : ", num) # 電話號碼是 :  2004959559

4)re.findall()函式

根據正則表示式搜尋字串,將所有符合的子字串放在一給表(list)中返回。
語法:

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

程式碼示例:

line = "Cats are smarter than dogs"
matchObj = re.findall(r'(.*) are (.*?) .*', line)
matchObj

[('Cats', 'smarter')]

參考連結:https://www.cnblogs.com/vamei/archive/2012/08/31/2661870.html