1. 什么是正則表達(dá)式
正則表達(dá)式盒刚,也稱為規(guī)則表達(dá)式细诸,英文名稱Regular Expression,我們?cè)诔绦蛑薪?jīng)常會(huì)縮寫(xiě)為regex或者regexp惕它,專門(mén)用于進(jìn)行文本檢索怕午、匹配、替換等操作的一種技術(shù)淹魄。
2. Python中的正則表達(dá)式
2.1 Python中的正則表達(dá)式模塊re
Python提供的正則表達(dá)式處理模塊re郁惜,提供了正則表達(dá)式的處理函數(shù)
2.2 字符串查詢匹配的函數(shù)
函數(shù) |
描述 |
re.match(reg,info) |
用于在開(kāi)始位置匹配目標(biāo)字符串info中符合正則表達(dá)式reg的字符,匹配成功會(huì)返回一個(gè)match對(duì)象甲锡,匹配不成功返回None |
re.serach(reg,info) |
掃描整個(gè)字符串info,使用正則表達(dá)式reg進(jìn)行匹配兆蕉,匹配成功返回匹配的第一個(gè)match對(duì)象,匹配不成功返回None |
re.findall(reg,info) |
掃描整個(gè)字符串info缤沦,經(jīng)復(fù)核正則表達(dá)式reg的字符串全部提取出來(lái)存放在列表中返回 |
re.fullmatch(reg,info) |
掃描整個(gè)字符串虎韵,如果整個(gè)字符串都包含在正則表達(dá)式表示的范圍中,返回整個(gè)字符串缸废,否則返回None |
re.finditer(reg,info) |
掃描整個(gè)字符串包蓝,將匹配到的字符包含在一個(gè)可以遍歷的列表中 |
2.3 字符串拆分替換的函數(shù)
函數(shù) |
描述 |
re.split(reg,string) |
使用指定的正則表達(dá)式reg匹配的字符缩多,將字符串string拆分成一個(gè)字符串列表,如:re.split(r”\s+”,info),表示使用一個(gè)或者多個(gè)空白字符串info進(jìn)行拆分养晋,并返回一個(gè)拆分后的字符串列表 |
re.sub(reg,repl,string) |
使用指定的字符串repl來(lái)替換目標(biāo)字符串string中匹配正則表達(dá)式reg的字符 |
2.4 正則表達(dá)式中的元字符
元字符 |
描述 |
^ |
表示匹配字符串的開(kāi)頭位置的字符 |
$ |
表示匹配字符串的結(jié)束位置的字符 |
. |
表示匹配任意一個(gè)字符 |
\d |
匹配一個(gè)數(shù)字字符 |
\D |
匹配一個(gè)非數(shù)字字符 |
\s |
匹配一個(gè)空白字符 |
\S |
匹配一個(gè)非空白字符 |
\w |
匹配一個(gè)數(shù)字/字母/下劃線中任意一個(gè)字符 |
\W |
匹配一個(gè)非數(shù)字字母下劃線的任意一個(gè)字符 |
\d |
匹配一個(gè)單詞的邊界 |
\B |
匹配不是單詞的開(kāi)頭或者結(jié)束位置 |
2.5 實(shí)例
- re.match()
import re
info1 = "Hello world,you are beautiful"
info2 = "hello%"
#定義正則表達(dá)式
regStart = r"wow"
#從字符串開(kāi)始位置匹配衬吆,是否包含符合正則表達(dá)式的內(nèi)容
print(re.match(regStart,info1))
- re.search
import re
info1 = "Hello world,you are beautiful, you are cute"
info2 = "hello%"
#定義正則表達(dá)式
regStart = r"are"
#掃描整個(gè)字符串,是否包含符合正則表達(dá)式的內(nèi)容绳泉,返回匹配到的第一個(gè)字符串的match對(duì)象
print(re.search(regStart,info1))
#輸出:<_sre.SRE_Match object; span=(16, 19), match='are'>
- re.findall()
import re
info1 = "Hello world,you are beautiful, you are cute"
info2 = "hello%"
#定義正則表達(dá)式
regStart = r"are"
#掃描整個(gè)字符串逊抡,是否包含符合正則表達(dá)式的內(nèi)容,返回匹配到的字符串的迭代對(duì)象
print(re.findall(regStart,info1))
#輸出:['are', 'are']
- re.fullmatch()
import re
info1 = "Hello world,you are beautiful, you are cute"
info2 = "hello%"
info3 = 'hello'
#定義正則表達(dá)式
regStart = r"are"
#掃描整個(gè)字符串零酪,是否包含符合正則表達(dá)式的內(nèi)容冒嫡,返回匹配到的第一個(gè)字符串的match對(duì)象
print(re.fullmatch(r"\w*",info3))
print(re.fullmatch(r"\w*",info2))
#輸出:<_sre.SRE_Match object; span=(0, 5), match='hello'>
None
2.6 正則表達(dá)式中的詞量
詞量 |
描述 |
x* |
用于匹配符號(hào)*前面的字符出現(xiàn)0次或者多次 |
x+ |
用于匹配符號(hào)+前面的字符出現(xiàn)1次或者多次 |
x? |
用于匹配符號(hào)?前面的字符出現(xiàn)0次或者1次 |
x{n} |
用于匹配符號(hào){n}前面的字符出現(xiàn)n次 |
x{m,n} |
用于匹配符號(hào){m,n}前面的字符至少出現(xiàn)m次,最多n次 |
x{n,} |
用于匹配符號(hào){n,}前面的字符至少出現(xiàn)n次 |
2.6.1 實(shí)例
import re
info = "look look!,good gooood!"
#匹配一段字符中出現(xiàn)單詞o字符0次或多次的情況
print(re.findall(r"o*",info))
#匹配一段字符串中出現(xiàn)單詞o字符出現(xiàn)1次或多次的情況
print(re.findall(r"o+",info))
#匹配一段字符串中出現(xiàn)單詞o字符出現(xiàn)0或1次的情況
print(re.findall(r"o?",info))
#匹配字符串中連續(xù)出現(xiàn)2次字符o的情況
print(re.findall(r"o{2}",info))
#匹配字符串中連續(xù)出現(xiàn)2次以上字符o的情況
print(re.findall(r"o{2,}",info))
#匹配字符串中連續(xù)出現(xiàn)2次以上3次以內(nèi)o字符的情況
print(re.findall(r"o{2,3}",info))
#輸出:
['', 'oo', '', '', '', 'oo', '', '', '', '', 'oo', '', '', '', 'oooo', '', '', '']
['oo', 'oo', 'oo', 'oooo']
['', 'o', 'o', '', '', '', 'o', 'o', '', '', '', '', 'o', 'o', '', '', '', 'o', 'o', 'o', 'o', '', '', '']
['oo', 'oo', 'oo', 'oo', 'oo']
['oo', 'oo', 'oo', 'oooo']
['oo', 'oo', 'oo', 'ooo']
2.7 正則表達(dá)式中的范圍匹配
范圍 |
描述 |
[0-9] |
用于匹配一個(gè)0-9之間的數(shù)字四苇,等價(jià)于\d |
[^0-9] |
用于匹配一個(gè)非數(shù)字字符孝凌,等價(jià)于\D |
[3-6] |
用于匹配一個(gè)3-6之間的數(shù)字 |
[a-z] |
用于匹配a-z之間的數(shù)字 |
[A-Z] |
用于匹配一個(gè)A~Z之間的字母 |
[a-zA-Z] |
用于匹配一個(gè)a~z或者A-Z之間的字母,匹配任意一個(gè)字母 |
[a-zA-Z0-9] |
用于匹配一個(gè)字母或者數(shù)字 |
[a-zA-Z0-9_] |
用于匹配一個(gè)字母或者數(shù)字或者下劃線月腋,等價(jià)于\w |
[^a-zA-Z0-9_] |
用于匹配一個(gè)非字母或者數(shù)字或者下劃線蟀架,等價(jià)于\W |
2.7.1 實(shí)例
import re
info = "Hello World_!.The price is 100!"
#匹配字符串中的數(shù)字
print(re.findall(r"[0-9]+",info))
#匹配小寫(xiě)字母
print(re.findall(r"[a-z]+",info))
#匹配大寫(xiě)字母
print(re.findall(r"[A-Z]+",info))
#匹配所有字母
print(re.findall(r"[A-Za-z]+",info))
#匹配小寫(xiě)字母和下劃線
print(re.findall(r"[a-z_]+",info))
#輸出:
['100']
['ello', 'orld', 'he', 'price', 'is']
['H', 'W', 'T']
['Hello', 'World', 'The', 'price', 'is']
['ello', 'orld_', 'he', 'price', 'is']
2.8 正則表達(dá)式中的分組
分組 |
描述 |
(expression) |
使用圓括號(hào)直接分組;正則表達(dá)式本身匹配的結(jié)果就是一個(gè)組榆骚,可以通過(guò)group()或者group(0)獲绕摹;正則表達(dá)式中包含的圓括號(hào)就是按照順序從1開(kāi)始編號(hào)的小組 |
(?P<name>expression) |
使用圓括號(hào)分組妓肢,然后給當(dāng)前的圓括號(hào)表示的小組命名為name捌省,可以通過(guò)group(name)進(jìn)行數(shù)據(jù)的獲取 |
2.8.1 實(shí)例
import re
phone = input("請(qǐng)輸入:")
#進(jìn)行正則匹配,得到match對(duì)象碉钠,對(duì)象中包含了分組信息
reg = re.search(r"^(\d{3,4})-(\d{4,8})$", phone)
print(reg)
#匹配結(jié)果為默認(rèn)的組纲缓,可以通過(guò)group()或者group(0)獲取
print(reg.group())
#獲取結(jié)果中第一個(gè)括號(hào)對(duì)應(yīng)的組數(shù)據(jù):處理區(qū)號(hào)
print(reg.group(1))
#獲取第二個(gè)括號(hào)對(duì)應(yīng)的組數(shù)據(jù):處理號(hào)碼
print(reg.group(2))
#輸出:
請(qǐng)輸入:010-6612345
<_sre.SRE_Match object; span=(0, 11), match='010-6612345'>
010-6612345
010
6612345
import re
phone = input("請(qǐng)輸入:")
# 進(jìn)行正則匹配,得到Match對(duì)象,對(duì)象中就包含了命名分組信息
res2 = re.search(r"^(?P<nstart>\d{3,4})-(?P<nend>\d{4,8})$", phone)
# 查看匹配結(jié)果
print(res2)
# 匹配結(jié)果為默認(rèn)的組喊废,可以通過(guò)group()或者group(0)獲取
print(res2.group(0))
# 通過(guò)名稱獲取指定的分組信息:處理區(qū)號(hào)
print(res2.group("nstart"))
# 通過(guò)名稱獲取指定分組的信息:處理號(hào)碼
#輸出:
請(qǐng)輸入:010-6612345
<_sre.SRE_Match object; span=(0, 11), match='010-6612345'>
010-6612345
010
2.9 正則表達(dá)式中的特殊用法
表達(dá)式 |
描述 |
(?:expression) |
作為正則表達(dá)式的一部分祝高,但是匹配結(jié)果丟棄 |
(?=expression) |
匹配expression表達(dá)式前面的字符,如 "How are you doing" ,正則"(?<txt>.+(?=ing))" 這里取ing前所有的字符操禀,并定義了一個(gè)捕獲分組名字為 "txt" 而"txt"這個(gè)組里的值為"How are you do" |
(?<=expression) |
匹配expression表達(dá)式后面的字符褂策,如 "How are you doing" 正則"(?<txt>(?<=How).+)" 這里取"How"之后所有的字符横腿,并定義了一個(gè)捕獲分組名字為 "txt" 而"txt"這個(gè)組里的值為" are you doing"; |
(?!expression) |
匹配字符串后面不是expression表達(dá)式字符颓屑,如 "123abc" 正則 "\d{3}(?!\d)"匹配3位數(shù)字后非數(shù)字的結(jié)果 |
(?<!expression) |
匹配字符串前面不是expression表達(dá)式字符,如 "abc123 " 正則 "(?<![0-9])123" 匹配"123"前面是非數(shù)字的結(jié)果也可寫(xiě)成"(?!<\d)123" |
2.10 正則表達(dá)式的貪婪模式和懶惰模式
2.10.1 貪婪模式
正則表達(dá)式匹配的一種模式耿焊,速度快揪惦,但是匹配的內(nèi)容會(huì)從字符串兩頭向中間搜索匹配,一旦匹配選中罗侯,就不繼續(xù)向字符串中間搜索了器腋。
2.10.2 懶惰模式
正則表達(dá)式,會(huì)首先搜索匹配正則表達(dá)式開(kāi)始位置的字符,然后逐步向字符串的結(jié)束位置查找纫塌,一旦找到匹配的就返回诊县,然后接著查找