正則表達式(regular expression)主要功能是從字符串(string)中通過特定的模式(pattern),搜索想要找到的內容。
re 模塊使 Python 語言擁有全部的正則表達式功能。
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