python正則表達(dá)式最詳解
一、正則表達(dá)式–元字符
re 模塊使 Python 語(yǔ)言擁有全部的正則表達(dá)式功能

1. 數(shù)量詞
# 提取大小寫(xiě)字母混合的單詞
import re
a = 'Excel 12345Word23456PPT12Lr'
r = re.findall('[a-zA-Z]{3,5}',a)
# 提取字母的數(shù)量3個(gè)到5個(gè)
print(r)
# ['Excel', 'Word', 'PPT']
# 貪婪 與 非貪婪 【Python默認(rèn)使用貪婪模式】
# 貪婪:'[a-zA-Z]{3,5}'
# 非貪婪:'[a-zA-Z]{3,5}?' 或 '[a-zA-Z]{3}'
# 建議使用后者,不要使用?號(hào),否則你會(huì)與下面的?號(hào)混淆
# 匹配0次或無(wú)限多次 *號(hào),*號(hào)前面的字符出現(xiàn)0次或無(wú)限次
import re
a = 'exce0excell3excel3'
r = re.findall('excel*',a)
r = re.findall('excel.*',a) # ['excell3excel3']
# excel 沒(méi)有l(wèi) 有很多l(xiāng)都可以匹配出來(lái)
print(r)
# ['exce', 'excell', 'excel']
# 匹配1次或者無(wú)限多次 +號(hào),+號(hào)前面的字符至少出現(xiàn)1次
import re
a = 'exce0excell3excel3'
r = re.findall('excel+',a)
print(r)
# ['excell', 'excel']
# 匹配0次或1次 ?號(hào),?號(hào)經(jīng)常用來(lái)去重復(fù)
import re
a = 'exce0excell3excel3'
r = re.findall('excel?',a)
print(r)
# ['exce', 'excel', 'excel']
2. 字符匹配

line = 'xyz,xcz.xfc.xdz,xaz,xez,xec'
r = re.findall('x[de]z', line)
# pattern 是x開(kāi)始,z結(jié)束,含d或e
print(r)
# ['xdz', 'xez']
r = re.findall('x[^de]z', line)
# pattern 是x開(kāi)始,z結(jié)束,不是含d或e
print(r)
# ['xyz', 'xcz', 'xaz']
# \w 可以提取中文,英文,數(shù)字和下劃線,不能提取特殊字符
import re
a = 'Excel 12345Word\n23456_PPT12lr'
r = re.findall('\w',a)
print(r)
# ['E', 'x', 'c', 'e', 'l', '1', '2', '3', '4', '5', 'W', 'o', 'r', 'd', '2', '3', '4', '5', '6', '_', 'P', 'P', 'T', '1', '2', 'l', 'r']
# \W 提取特殊字符,空格 \n \t
import re
a = 'Excel 12345Word\n23456_PPT12lr'
r = re.findall('\W',a)
print(r)
# [' ', '\n']
3. 邊界匹配

# 限制電話號(hào)碼的位置必需是8-11位才能提取
import re
tel = '13811115888'
r = re.findall('^\d{8,11}$',tel)
print(r)
# ['13811115888']
4. 組
# 將abc打成一個(gè)組,{2}指的是重復(fù)幾次,匹配abcabc
import re
a = 'abcabcabcxyzabcabcxyzabc'
r = re.findall('(abc){2}',a) # 與
# ['abc', 'abc']
print(r)
r = re.findall('(abc){3}',a)
# ['abc']
5. 匹配模式參數(shù)

# findall第三參數(shù) re.I忽略大小寫(xiě)
import re
a = 'abcFBIabcCIAabc'
r = re.findall('fbi',a,re.I)
print(r)
# ['FBI']
# 多個(gè)模式之間用 | 連接在一起
import re
a = 'abcFBI\nabcCIAabc'
r = re.findall('fbi.{1}',a,re.I | re.S)
# 匹配fbi然后匹配任意一個(gè)字符包括\n
print(r)
# ['FBI\n']
二、方法
re.findall
- 匹配出字符串中所有 與制定值相關(guān)的值
- 以列表的形式返回
- 未匹配則返回空列表
import re re.findall(pattern, string, flags=0) pattern.findall(string[ , pos[ , endpos]])
import re
line = "111aaabbb222小呼嚕奧利奧"
r = re.findall('[0-9]',line)
print(r)
# ['1', '1', '1', '2', '2', '2']
re.match
- re.match 嘗試從字符串的起始位置匹配一個(gè)模式
- 如果不是起始位置匹配成功的話,match()就返回none。
re.match(pattern, string, flags=0) # (標(biāo)準(zhǔn),要匹配的,標(biāo)志位)
print(re.match('www','www.xxxx.com'))
print(re.match('www','www.xxxx.com').span())
print(re.match('com','www.xxxx.com'))
<re.Match object; span=(0, 3), match='www'> (0, 3) None
group匹配對(duì)象
import re
a = 'life is short,i use python,i love python'
r = re.search('life(.*)python(.*)python',a)
print(r.group(0)) # 完整正則匹配 ,life is short,i use python,i love python
print(r.group(1)) # 第1個(gè)分組之間的取值 is short,i use
print(r.group(2)) # 第2個(gè)分組之間的取值 ,i love
print(r.group(0,1,2)) # 以元組形式返回3個(gè)結(jié)果取值 ('life is short,i use python,i love python', ' is short,i use ', ',i love ')
print(r.groups()) # 返回就是group(1)和group(2) (' is short,i use ', ',i love ')
import re
# .* 表示任意匹配除換行符(\n、\r)之外的任何單個(gè)或多個(gè)字符
# (.*?) 表示"非貪婪"模式,只保存第一個(gè)匹配到的子串
# re.M 多行匹配,影響 ^ 和 $
# re.I 使匹配對(duì)大小寫(xiě)不敏感
line = "Cats are smarter than dogs"
matchObj1 = re.match(r'(.*) are (.*?) .*', line, re.M|re.I)
matchObj2 = re.match(r'(.*) smarter (.*?) .*', line, re.M|re.I)
matchObj3 = re.match(r'(.*) than (.*)', line, re.M|re.I)
print(matchObj1)
print(matchObj2)
print(matchObj3)
# <re.Match object; span=(0, 26), match='Cats are smarter than dogs'>
# <re.Match object; span=(0, 26), match='Cats are smarter than dogs'>
# None
if matchObj1:
print ("matchObj1.group() : ", matchObj1.group())
print ("matchObj1.group(1) : ", matchObj1.group(1))
print ("matchObj1.group(2) : ", matchObj1.group(2))
else:
print ("No match!!")
if matchObj2:
print ("matchObj2.group() : ", matchObj2.group())
print ("matchObj2.group(1) : ", matchObj2.group(1))
print ("matchObj2.group(2) : ", matchObj2.group(2))
else:
print ("No match!!")
if matchObj3:
print ("matchObj3.group() : ", matchObj3.group())
print ("matchObj3.group(1) : ", matchObj3.group(1))
print ("matchObj3.group(2) : ", matchObj3.group(2))
else:
print ("No match!!")
# matchObj1.group() : Cats are smarter than dogs
# matchObj1.group(1) : Cats
# matchObj1.group(2) : smarter
# matchObj2.group() : Cats are smarter than dogs
# matchObj2.group(1) : Cats are
# matchObj2.group(2) : than
# matchObj3.group() : Cats are smarter than dogs
# matchObj3.group(1) : Cats are smarter
# matchObj3.group(2) : dogs
import re
# 點(diǎn) 是匹配單個(gè)字符
# 星是前面的東西出現(xiàn)0次或無(wú)數(shù)次
# 點(diǎn)星就是任意字符出現(xiàn)0次或無(wú)數(shù)次
str = "a b a b"
matchObj1 = re.match(r'a(.*)b', str, re.M|re.I)
matchObj2 = re.match(r'a(.*?)b', str, re.M|re.I)
print("matchObj1.group() : ", matchObj1.group())
print("matchObj2.group() : ", matchObj2.group())
# matchObj1.group() : a b a b
# matchObj2.group() : a b
re.search
掃描整個(gè)字符串并返回第一個(gè)成功的匹配。
re.search(pattern, string, flags=0)
import re
line = "cats are smarter than dogs"
matchObj = re.match(r'dogs',line,re.M|re.I)
matchObj1= re.search(r'dogs',line,re.M|re.I)
matchObj2= re.match(r'(.*) dogs',line,re.M|re.I)
if matchObj:
print ("match --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
if matchObj1:
print ("match --> matchObj1.group() : ", matchObj1.group())
else:
print ("No match!!")
if matchObj2:
print ("match --> matchObj2.group() : ", matchObj2.group())
else:
print ("No match!!")
# No match!!
# match --> matchObj1.group() : dogs
# match --> matchObj2.group() : cats are smarter than dogs
re.compile
- re.compile是將正則表達(dá)式轉(zhuǎn)換為模式對(duì)象
- 這樣可以更有效率匹配。使用compile轉(zhuǎn)換一次之后,以后每次使用模式時(shí)就不用進(jìn)行轉(zhuǎn)換
三、檢索和替換
re.sub 替換字符串
re.sub('被替換的','替換成的',a)
# 把FBI替換成BBQ
import re
a = 'abcFBIabcCIAabc'
r = re.sub('FBI','BBQ',a)
print(r)
# 把FBI替換成BBQ,第4參數(shù)寫(xiě)1,證明只替換第一次,默認(rèn)是0(無(wú)限替換)
import re
a = 'abcFBIabcFBIaFBICIAabc'
r = re.sub('FBI','BBQ',a,1)
print(r)
# abcBBQabcCIAabc
# abcBBQabcFBIaFBICIAabc
# 把函數(shù)當(dāng)參數(shù)傳到sub的列表里,實(shí)現(xiàn)把業(yè)務(wù)交給函數(shù)去處理,例如將FBI替換成$FBI$
import re
a = 'abcFBIabcFBIaFBICIAabc'
def 函數(shù)名(形參):
分段獲取 = 形參.group() # group()在正則表達(dá)式中用于獲取分段截獲的字符串,獲取到FBI
return '$' + 分段獲取 + '$'
r = re.sub('FBI',函數(shù)名,a)
print(r)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
pycharm的debug調(diào)試以及異常,Python中錯(cuò)誤的處理過(guò)程
這篇文章主要介紹了pycharm的debug調(diào)試以及異常,Python中錯(cuò)誤的處理過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Python中CSV文件(逗號(hào)分割)實(shí)戰(zhàn)操作指南
CSV文件默認(rèn)以英文逗號(hào)做為列分隔符,換行符作為行分隔符,下面這篇文章主要給大家介紹了關(guān)于Python中CSV文件(逗號(hào)分割)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
Python 反轉(zhuǎn)字符串(reverse)的方法小結(jié)
這篇文章主要介紹了Python 反轉(zhuǎn)字符串(reverse)的方法小結(jié),需要的朋友可以參考下2018-02-02
pycharm如何實(shí)現(xiàn)跨目錄調(diào)用文件
這篇文章主要介紹了pycharm如何實(shí)現(xiàn)跨目錄調(diào)用文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
Python實(shí)現(xiàn)關(guān)鍵路徑和七格圖計(jì)算詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)關(guān)鍵路徑和七格圖計(jì)算,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-03-03
Python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫(huà)的示例
本篇文章主要介紹了Python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫(huà)的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
Python matplotlib實(shí)現(xiàn)條形統(tǒng)計(jì)圖
這篇文章主要為大家詳細(xì)介紹了Python matplotlib實(shí)現(xiàn)條形統(tǒng)計(jì)圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
pytorch: tensor類(lèi)型的構(gòu)建與相互轉(zhuǎn)換實(shí)例
今天小編就為大家分享一篇pytorch: tensor類(lèi)型的構(gòu)建與相互轉(zhuǎn)換實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07

