match 和 search 只匹配一次,當正則表達式在字符串中匹配到多個結果時,在不指定全部返回的情況下,只返回最先匹配到的第一個結果。
re.match 嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。函數語法:re.match(pattern, string, [flags])re.search 掃描整個字符串從任意位置匹配並返回第一個成功的匹配。函數語法:re.search(pattern, string, [flags])re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。所以實際應用往往使用re.search()函數。pattern:匹配的正則表達式(參考後面的正則表達式匹配模式附件)。flags:標誌位,用於控制正則表達式的匹配方式(參考後面的flags匹配模式模塊)group(num) / groups() :我們可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式group(num=0):匹配的整個表達式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。groups():返回一個包含所有小組字符串的元組,從 1 到 所含的小組號。re.match函數案例:#!/usr/bin/python
# -*- coding: UTF-8 -*-
import re
line = "This is a regular expression for python"
matchObj = re.match(r'(.*) is (.*?) .*', line, re.M | re.I)
if matchObj:
print("matchObj.span() :",matchObj.span())
print("matchObj.group() : ", matchObj.group())
print("matchObj.group(1) : ", matchObj.group(1))
print("matchObj.group(2) : ", matchObj.group(2))
print("matchObj.groups()) :", matchObj.groups())
else:
print("No match!!")
# 結果:
# matchObj.span() : (0, 39)
# matchObj.group() : This is a regular expression for python
# matchObj.group(1) : This
# matchObj.group(2) : a
# matchObj.groups()) : ('This', 'a')
re.search函數案例:#re.search()函數,掃描整個字符串從任意位置匹配並返回第一個成功的匹配。
line = "This is a regular expression for python"
searchObj = re.search(r"a (.*) for (p.*n$)",line,re.M | re.I)
print("searchObj.span() :",searchObj.span())
print("searchObj.group() : ", searchObj.group())#重點使用
print("searchObj.group(1) : ", searchObj.group(1))
print("searchObj.groups() : ", searchObj.groups())
# 輸出:
# searchObj.span() : (8, 39)
# searchObj.group() : a regular expression for python
# searchObj.group(1) : regular expression
# searchObj.groups() : ('regular expression', 'python')#re.mactch()函數和re.search()函數對比
import re
line = "This is a regular expression for python"
matchObj = re.match(r"python",line,re.M | re.I)
if matchObj:
print(matchObj.group())
else:
print("No match!!")
searchObj = re.search(r"python",line,re.M | re.I)
if searchObj:
print(searchObj.group())
else:
print("No search!!")
# 輸出:
# No match!!
# python
2、re.sub()函數,用於 檢索和替換Python 的 re 模塊提供了re.sub用於替換字符串中的匹配項。
語法:re.sub(pattern, repl, string, [count=0], [flags=0])count : 模式匹配後替換的最大次數,默認 0 表示替換所有的匹配。flags:標誌位,用於控制正則表達式的匹配方式,默認flags=0表示不進行特殊指定(參考後面的flags匹配模式模塊)#re.sub()函數 檢索和替換
import re
line = "112-568-774" # 結果:==> 112568774
subObj = re.sub(r"\D","",line, count=0, flags=0)
print(subObj)
#repl 參數是一個函數.將匹配的數字乘以 2
line= 'A23G4HFD567' # 結果:==> A46G8HFD1134
def double(x):
x = int(x.group('value'))*2
return str(x)
print(re.sub('(?P<value>\d+)',double,line))
# ?P<value>的意思就是命名一個名字為value的組,匹配規則符合後面的/d+
3、re.compile() 函數,生成一個正則表達式( Pattern )對象compile 函數用於編譯正則表達式,生成一個正則表達式( Pattern )對象,供 match() 、search() 、sub()、findall()、finditer()、split()等函數使用。
pattern = re.compile(pattern[, flags])m = pattern.match()/pattern.search()/.... #函數參數與re.match()/re.search()/... 對比少寫一個pattern參數即可,其他不變flags : 可選,表示匹配模式,比如忽略大小寫,多行模式等4、re.compile() 供 match() 和 search() 這兩個函數的使用string = "字符串"
pattern = re.compile(pattern [,flags])
m1 = pattern.match(string [, pos[, endpos]])
m2 = pattern.seach(string [, pos[, endpos]])
result = m1.group()
result = m2.group()
pos : 可選參數,指定字符串的起始位置,默認為0。endpos : 可選參數,指定字符串的結束位置,默認為字符串的長度。#編輯器:ipython
In [1]: import re
In [2]: pattern = re.compile(r"\d")
In [3]: m = pattern.match("abc123def456") #查找頭部是否有數字
In [4]: print(m)
None
In [5]: m1 = pattern.search("abc123edf456")#查詢字符串中的數字
In [6]: print(m1)
<re.Match object; span=(3, 4), match='1'>
In [7]: m2 = pattern.match("abc123456dfe",3,8) #指定起止位置的查找
In [8]: print(m2)
<re.Match object; span=(3, 4), match='1'>
In [9]: m3 = pattern.search("asd123456789gh",3,8) #指定起止位置的查找
In [10]: print(m3)
<re.Match object; span=(3, 4), match='1'>
In [11]: print(m3.group()) #返回結果
1
In [12]: #返回多值的正則表達式
In [13]: pattern = re.compile(r"\d+")
In [14]: m = pattern.search("asd123456789gh",3,8) #指定起止位置的查找
In [15]: print(m.group())
12345
In [16]: print(m.start(),m.end(),m.span())
3 8 (3, 8)
5、findall()使用,匹配的所有子串,列表返回在字符串中找到正則表達式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。
注意:match 和 search 是匹配一次,使用group()調用結果, findall 匹配所有,返回結果列表。
pattern = re.compile(pattern [,flags])result = pattern.findall(string[, pos[, endpos]])result = re.findall(pattern,string[, pos[, endpos]])pos : 可選參數,指定字符串的起始位置,默認為 0。endpos : 可選參數,指定字符串的結束位置,默認為字符串的長度。import re
#re.compile() 供findall(string[, pos[, endpos]])使用
s = "a12b12c12d12"
parttern = re.compile(r"\d+")
result1 = parttern.findall(s)
print(result1) # ['12', '12', '12', '12']
result2 = parttern.findall(s,0,5)
print(result2) # ['12', '1']
#單獨使用indall(string[, pos[, endpos]])
result3 = re.findall(r"\d+","20a20b20-20.20c2")
print(result3) #['20', '20', '20', '20', '20', '2']
6、re.finditer()使用,匹配的所有子串,迭代器返回與 findall 類似,在字符串中找到正則表達式所匹配的所有子串,並把它們作為一個迭代器返回。
pattern = re.compile(pattern [,flags])m = re.finditer(pattern, string, flags=0)m = pattern.finditer(string[, flags=0])pattern:匹配的正則表達式(參考後面的正則表達式匹配模式附件)。flags:標誌位,用於控制正則表達式的匹配方式(參考後面的flags匹配模式模塊)import re
pattern = re.compile(r"\d+")
it = pattern.finditer("12a32bc43jf3")
s = []
for i in it:
s.append(i.group()) #將結果轉化為列表
print(s) #['12', '32', '43', '3']
7、re.split()使用,將字符串分割後返回列表split 方法按照能夠匹配的子串將字符串分割後返回列表,
re.split(pattern, string[, maxsplit=0, flags=0])maxsplit:分隔次數,maxsplit=1 分隔一次,默認為 0,不限制次數。import re
s ="廣東-廣州-天河-2021-01-16"
pattern = re.compile(r"-")
s1 = pattern.split(s,maxsplit=3)
print(s1) #['廣東', '廣州', '天河', '2021-01-16']
8、'(?P...)' 分組匹配import re
s = '4225281994xxxxxxxx'
res = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})',s)
print(res.groupdict())
#{'province': '422', 'city': '528', 'born_year': '1994'}
附件1、flags匹配模式規則表修飾符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了增加可讀性,忽略空格和 # 後面的注釋0flags=0表示不進行特殊指定附件2、pattern正則表達式匹配模式規則表模式pattern描述說明^匹配字符串的開頭$匹配字符串末尾.匹配任意字符,除了換行符[可以用flag=re.S解決換行][...]用來表示一組字符,單獨列出:[jxr12] 表示匹配 'j'或'x'或'r'或1或2,[0-9]<=>[0123456789],[A-Z]表示任意大寫字母,[a-z]表示所有小寫字母[^...]不在[]內的其他字符,如:[^abc]匹配除abc的其他字符re*0個或者多個表達式re+1個或者多個表達式re?匹配0個或者1個由前面的正則式定義的片段,非貪婪方式。.*.* 代表匹配除換行符之外的所有字符。.*?.*? 後面多個問號,代表非貪婪模式,也就是說只匹配符合條件的最少字符re{n}精確匹配 n 個前面表達式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的兩個 o。re{n,}匹配 n 個前面表達式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等價於 "o+"。"o{0,}" 則等價於 "o*" 。re{n,m}匹配 n 到 m 次由前面的正則表達式定義的片段,貪婪方式x| y匹配x或者y(re)匹配括號內的表達式,也表示一個組(?imx)正則表達式包含三種可選標誌:i, m, 或 x 。只影響括號中的區域 。 (?-imx)正則表達式關閉 i, m, 或 x 可選標誌。只影響括號中的區域。(?: re)類似 (...), 但是不表示一個組(?imx: re)在括號中使用i, m, 或 x 可選標誌(?-imx: re)在括號中不使用i, m, 或 x 可選標誌(?#...)注釋.(?= re)前向肯定界定符。如果所含正則表達式,以 ... 表示,在當前位置成功匹配時成功,否則失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提高;模式的剩餘部分還要嘗試界定符的右邊。(?! re)前向否定界定符。與肯定界定符相反;當所含表達式不能在字符串當前位置匹配時成功(?> re)匹配的獨立模式,省去回溯。\w匹配字母數字及下劃線\W匹配非字母數字及下劃線\s匹配任意空白字符,等價於 [\t\n\r\f].\S匹配任意非空字符\d匹配任意數字,等價於 [0-9].\D匹配任意非數字\A匹配字符串開始\Z匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串。\z匹配字符串結束\G匹配最後匹配完成的位置。\b匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。\B匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。\n, \t, 等.匹配一個換行符。匹配一個制表符。等\1...\9匹配第n個分組的內容。\10匹配第n個分組的內容,如果它經匹配。否則指的是八進位字符碼的表達式。\轉義字符。如:\. 、\?、\* 轉義為本身的意思最後理解一下:[a-zA-Z0-9_-]+@[a-zA-Z0-9]+(.[a-zA-Z0-9]+)
表示a到z或A到Z或0到9任意1個或多個@a到z或A到Z或0到9任意1個或多個.a到z或A到Z或0到9任意1個或多個。即:xx···x@xx···x.xx···x,如:189xxxx7478@qq.com