Python正則表達(dá)式急速入門(小結(jié))
正則表達(dá)式在程序開發(fā)中會(huì)經(jīng)常用到,比如數(shù)據(jù)(格式)驗(yàn)證、替換字符內(nèi)容以及提取字符串內(nèi)容等等情況都會(huì)用到,但是目前許多開發(fā)人員對(duì)于正則表達(dá)式只是處于了解或者是基本會(huì)用的階段。一旦遇到大批量使用正則表達(dá)式的情況(例如網(wǎng)絡(luò)爬蟲)可以說基本上就抓瞎了。這篇文章我將帶領(lǐng)大家利用 Python 來學(xué)習(xí)一下正則表達(dá)式。在閱讀這篇文章前你需要掌握 Python 基礎(chǔ)知識(shí),或者具有其他開發(fā)語言的基礎(chǔ)知識(shí)也可以,因?yàn)榛旧厦糠N語言使用正則表達(dá)式的方式都是類似的。
零、正則表達(dá)式基礎(chǔ)
1.提取字符(串) 有時(shí)我們需要從一個(gè)字符串中獲取一段內(nèi)容,這段內(nèi)容可能是一個(gè)字符也可能是一段字符串,如果用逐字對(duì)比遍歷的話不僅耗時(shí)耗力而且還容易出錯(cuò)。那么這個(gè)時(shí)候我們就可以用到正則表達(dá)式中的 字符匹配 功能。正則表達(dá)式為我們提供了 4 種字符匹配的方法,見下表:
| 語法 | 說明 | 例子 | 可匹配字符串 |
|---|---|---|---|
| . | 匹配除了換行符 “\n” 以外的任意字符 | a.b | acb、adb、a2b、a~b |
| \ | 轉(zhuǎn)義,將轉(zhuǎn)移字符后面的一個(gè)字符改變?cè)瓉淼囊馑?/td> | a[b\.\\]c | abc、a.c、a\c |
| [] | 匹配括號(hào)內(nèi)的任意字符 | a[b,c,d,e]f | abd、acf、adf、aef |
| [^] | 除了括號(hào)內(nèi)的字符外,其他的字符都匹配 | aa,b,c,d,ef | a1f、a#f、azf、agf |
2.預(yù)定義字符 所謂預(yù)定義字符就是正則表達(dá)式中為我們預(yù)留的專門用來匹配格式化內(nèi)容的字符,例如匹配數(shù)字用的 \d 和匹配空白符的 \s 等等。我們可以利用預(yù)定義字符快速的匹配出一個(gè)字符串中符合要求的內(nèi)容。預(yù)定義字符匹配的內(nèi)容,同樣也可以利用前面所講的字符匹配的方式匹配出來,但是代碼量會(huì)相對(duì)來說多一點(diǎn)。下表所列的就是預(yù)定義字符:
| 語法 | 說明 | 例子 | 可匹配字符串 |
|---|---|---|---|
| ^ | 以什么字符串開始 | ^123 | 123abc、123321、123zxc |
| $ | 以什么字符串結(jié)尾 | 123$ | abc123、321123、zxc123 |
| \b | 匹配單詞邊界,不匹配任何字符 | \basd\b | asd |
| \d | 匹配數(shù)字0-9 | zx\dc | zx1c、zx2c、zx5c |
| \D | 匹配非數(shù)字 | zx\Dc | zxvc、zx$c、zx&c |
| \s | 匹配空白符 | zx\sc | zx c |
| \S | 匹配非空白符 | zx\Sc | zxac、zx1c、zxtc |
| \w | 匹配字母、數(shù)字和下劃線 | zx\wc | zxdc、zx1c、zx_c |
| \W | 匹配非字母、數(shù)字和下劃線 | zx\Wc | zx c、zx$c、zx(c |
在預(yù)定義字符中有如下幾點(diǎn)需要注意:
- \b 匹配的只是一個(gè)位置,這個(gè)位置的一側(cè)是構(gòu)成單詞的字符,另一側(cè)為非單詞字符、字符串的開始或結(jié)束位置。\b 是零寬度。
- \w 在不同編碼語言中匹配的范圍是不一樣的,在使用 ASCII 碼的語言中匹配的是 [a-zA-Z0-9] ,而在使用 Unicode 碼的語言中匹配的是 [a-zA-Z0-9] 和漢字、全角符號(hào)等特殊字符。
3.限制數(shù)量 在某些情況下我們需要匹配重復(fù)的內(nèi)容,這時(shí)我們可以使用 數(shù)量限定 模式來進(jìn)行操作。數(shù)量限定如下表:
| 語法 | 說明 | 例子 | 可匹配字符串 |
|---|---|---|---|
| * | 匹配0到多次 | zxc* | zx、zxccccc |
| + | 匹配1次到多次 | zxc+ | zxc、zxccccc |
| ? | 匹配0次或1次 | zxc? | zxc、zx |
| {m} | 匹配m次 | zxc{3}vb | zxcccvb |
| {m,} | 匹配m次或多次 | zxc{3,}vb | zxcccvb、zxccccccccvb |
| {,n} | 匹配0次到n次 | zxc{,3}vb | zxvb、zxcvb、zxccvb、zxcccvb |
| {m,n} | 匹配m次到n次 | zxc{1,3} | zxcvb、zxccvb、zxcccvb |
4.斷言 斷言,又稱零寬斷言,指的是當(dāng)斷言表達(dá)式為 True 時(shí)才進(jìn)行匹配,但是并不匹配斷言表達(dá)式內(nèi)容。和 ^ 代表開頭, $ 代表結(jié)尾, \b 代表單詞邊界一樣,先行斷言和后行斷言也有類似的作用,它們只匹配某些位置,在匹配過程中,不占用字符,所以被稱為零寬。所謂位置,是指字符串中第一個(gè)字符的左邊、最后一個(gè)字符的右邊以及相鄰字符的中間。零寬斷言表達(dá)式有四種:
- 零寬度負(fù)回顧后發(fā)斷言 (?<!exp),表達(dá)式不成立時(shí)匹配斷言后面的位置,成立時(shí)不匹配。例如 \w+(?<zxc)\d,匹配不以 zxc 結(jié)尾的字符串;
- 零寬度負(fù)回顧先行斷言 (?!exp),表達(dá)式匹配斷言前面的位置,成立時(shí)則不匹配。例如:\d(?!zxc)\w+,匹配不以 zxc 開頭的字符串;
- 先行斷言 (?=exp),斷言為真時(shí)匹配斷言前面的位置,例如要在 “a regular expression” 這個(gè)字符串中追匹配出 regular 中的 re ,我們可以這么寫 re(?=gular);
- 后發(fā)斷言 (?<=exp),斷言為真時(shí)匹配斷言后面的位置,例如對(duì) “egex represents regular expression” 這個(gè)字符串要想匹配除 regex 和 regular 之外的re,可以用 re(?!g),該表達(dá)式限定了re右邊的位置,這個(gè)位置后面不是字符g。先行和后發(fā)的區(qū)別就在于該位置之后的字符能否匹配括號(hào)中的表達(dá)式。
5.貪婪/非貪婪 正則表達(dá)式會(huì)盡可能多的去匹配字符,這被稱為貪婪模式,貪婪模式是正則表達(dá)式默認(rèn)的模式。但是有時(shí)候貪婪模式會(huì)給我們?cè)斐刹槐匾睦_,例如我們要匹配字符串 “Jack123Chen123Chen” 中的 “Jack123Chen”,但是貪婪模式匹配出的卻是 “Jack123Chen123Chen”,這時(shí)我們就需要用到非貪婪模式來解決這個(gè)問題,非貪婪模式常用的表達(dá)式如下:
| 語法 | 說明 |
|---|---|
| *? | 匹配0次或多次,但要盡可能少重復(fù) |
| +? | 匹配1次或多次,但要盡可能少重復(fù) |
| ?? | 匹配0次或1次,但要盡可能少重復(fù) |
| {m,}? | 匹配m次或多次,但要盡可能少重復(fù) |
| {m,n}? | 匹配m次或n次,但要盡可能少重復(fù) |
6.其他 上述內(nèi)容在正則表達(dá)式中都是常用的,下面我們?cè)賮砜纯床怀S玫降?,但是功能同樣?qiáng)大的語法。
- OR 匹配又稱匹配分支,也就是說只要有一個(gè)分支匹配就算匹配,這和我們?cè)陂_發(fā)中使用的 OR 語句類似。OR 匹配利用 | 分割分支,例如我們需要匹配出英文姓名,但是在英文中姓和名中間有可能是以 · 分割,也有可能是以空格分隔,這時(shí)我們就可以利用 OR 匹配來處理這個(gè)問題。格式如下:[A-Za-z]+·[A-Za-z]+|[A-Za-z]+\s[A-Za-z]+
- 組合,將幾個(gè)項(xiàng)組合為一個(gè)單元,這個(gè)單元可通過* + ? | 等符號(hào)加以修飾,而且可以記住和這個(gè)組合相匹配的字符串以提供伺候的引用使用。分組使用 () 來表示。例如獲取日期的正則表達(dá)式可以這么寫:\d{4}-(0[1-9]|1[0-2])-(0[1-9]|12|3[01])。第一個(gè)分組 (0[1-9]|1[0-2]) 代表月的正則匹配,第二個(gè)分組 (0[1-9]|12|3[01]) 代表日的正則匹配。
一、Python 使用正則表達(dá)式
在 Python 中使用正則表達(dá)式很簡(jiǎn)單,re 模塊向我們提供了正則表達(dá)式的支持。使用步驟一共三步:
- 將正則表達(dá)式字符串轉(zhuǎn)換為 Pattern 的實(shí)例;
- 使用 Pattern 實(shí)例去處理要匹配的字符,匹配結(jié)果是一個(gè) Match 實(shí)例;
- 利用 Match 實(shí)例去進(jìn)行之后的操作。
在 Python 中我們常用的 re 的方法有六種,分別是: compile 、 match 、 search 、 findall 、 split 和 sub ,下面就針對(duì)這六種方法進(jìn)行一下講解。
compile compile 方法的作用是將正則表達(dá)式字符串轉(zhuǎn)化為 Pattern 實(shí)例,它具有兩個(gè)參數(shù) pattern 和 flags ,pattern 參數(shù)類型是 string 類型,接收的是正則表達(dá)式字符串,flags 類型是 int 類型,接收的是匹配模式的編號(hào),flags 參數(shù)是非必填項(xiàng),默認(rèn)值為 0 (忽略大小寫)。flags 匹配模式有如下 6 種:
| 匹配模式 | 說明 |
|---|---|
| re.I | 忽略大小寫 |
| re.M | 多行匹配模式 |
| re.S | 任意匹配模式 |
| re.L | 預(yù)定義字符匹配模式 |
| re.U | 限定字符匹配模式 |
| re.V | 詳細(xì)模式 |
上述六種模式在實(shí)際開發(fā)中很少用到,我們只需要了解即可。 使用 compile 很簡(jiǎn)單,如下:
import re pattern = re.compile(r'\d')
2.match match 的作用是利用 Pattern 實(shí)例,從字符串左側(cè)開始匹配,如果匹配到就返回一個(gè) Match 實(shí)例,如果沒有匹配到就返回 None。
import re
def getMatch(message):
pattern = re.compile(r'(\d{4}[-年])(\d{2}[-月])(\d{2}日{(diào)0,1})')
match = re.match(pattern, message)
if match:
print(match.groups())
for item in match.groups():
print(item)
else:
print("沒匹配上")
if __name__ == '__main__':
message = "2019年01月23日大會(huì)開始"
getMatch(message)
message = "會(huì)議于2019-01-23召開"
getMatch(message)
在代碼中我們使用了 groups 方法,這個(gè)方法用來獲取匹配出來的字符串組。到這里過一會(huì)有很多讀者感到納悶,為什么第一段內(nèi)容能匹配出來年月日,而第二段內(nèi)容不能呢?這是因?yàn)?match 方法是從字符串的起始位置匹配的。 代碼運(yùn)行結(jié)果如圖:

3.search search 方法與 match 方法功能是一樣的,只不過 search 方法是對(duì)整個(gè)字符串進(jìn)行匹配。將前一小節(jié)代碼中的 getMatch 方法進(jìn)行改動(dòng),即可將第二段內(nèi)容中的年月日匹配出來。
import re
def getMatch(message):
pattern = re.compile(r'(\d{4}[-年])(\d{2}[-月])(\d{2}日{(diào)0,1})')
match = re.search(pattern, message)
if match:
print(match.groups())
for item in match.groups():
print(item)
else:
print("沒匹配上")
if __name__ == '__main__':
message = "2019年01月23日大會(huì)開始"
getMatch(message)
message = "會(huì)議于2019-01-23召開"
getMatch(message)
上述代碼運(yùn)行結(jié)果如下圖:

4.findall findall 方法的作用是匹配整個(gè)字符串,以列表的形式返回所有匹配結(jié)果。
import re
def getMatch(message):
pattern = re.compile(r'\w+')
match = re.findall(pattern, message)
if match:
print(match)
else:
print("沒匹配上")
if __name__ == '__main__':
message = "my name is 張三"
getMatch(message)
message = "張三 is me"
getMatch(message)
代碼運(yùn)行結(jié)果如下圖:

5.split split 方法是利用指定的字符來分割字符串。
import re
def getMatch(message):
pattern = re.compile(r'-')
match = re.split(pattern, message)
if match:
print(match)
else:
print("沒匹配上")
if __name__ == '__main__':
message = "2018-9-12"
getMatch(message)
message = "第一步-第二步-第三步-第四步-and more"
getMatch(message)
上述代碼運(yùn)行結(jié)果如下圖:

6.sub sub 方法用來替換字符串,它接受5個(gè)參數(shù),其中常用的有三個(gè):
- pattern,Pattern 實(shí)例
- string,等待替換的字符串
- repl,表示替換的新字符串或需要執(zhí)行的替換方法
- count,替換次數(shù),默認(rèn)為0表示全部替換
import re def getMatch(match): return match.group(0).replace(r'年齡', 'age') if __name__ == '__main__': message = "your 年齡 ?" pattern=re.compile(r'\w+') print(re.sub(pattern,getMatch,message))
代碼運(yùn)行結(jié)果如下圖:

三、總結(jié)
Python 中正則表達(dá)式使用起來非常方便,上面所展示的代碼,完全可以直接復(fù)制出來稍加修改后放在項(xiàng)目中使用。內(nèi)容不多,主要是講解代碼怎么使用,希望大家完全理解掌握了正則表達(dá)式的寫法。
作者簡(jiǎn)介:
朱鋼,筆名喵叔,國(guó)內(nèi)某技術(shù)博客認(rèn)證專家,.NET高級(jí)開發(fā)工程師,7年一線開發(fā)經(jīng)驗(yàn),參與過電子政務(wù)系統(tǒng)和AI客服系統(tǒng)的開發(fā),以及互聯(lián)網(wǎng)招聘網(wǎng)站的架構(gòu)設(shè)計(jì),目前就職于一家初創(chuàng)公司,從事企業(yè)級(jí)安全監(jiān)控系統(tǒng)的開發(fā)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python中正則表達(dá)式的詳細(xì)教程
- python正則表達(dá)式re模塊詳細(xì)介紹
- python的正則表達(dá)式re模塊的常用方法
- python利用正則表達(dá)式提取字符串
- Python匹配中文的正則表達(dá)式
- PYTHON正則表達(dá)式 re模塊使用說明
- Python使用中文正則表達(dá)式匹配指定中文字符串的方法示例
- python使用正則表達(dá)式提取網(wǎng)頁(yè)URL的方法
- 零基礎(chǔ)寫python爬蟲之神器正則表達(dá)式
- Python正則表達(dá)式如何進(jìn)行字符串替換實(shí)例
- python正則表達(dá)式中的括號(hào)匹配問題
- Python 中文正則表達(dá)式筆記
相關(guān)文章
Python實(shí)現(xiàn)簡(jiǎn)單截取中文字符串的方法
這篇文章主要介紹了Python實(shí)現(xiàn)簡(jiǎn)單截取中文字符串的方法,涉及Python字符串截取與編碼轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下2015-06-06
Python深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)殘差塊
這篇文章主要為大家介紹了Python深度學(xué)習(xí)中的神經(jīng)網(wǎng)絡(luò)殘差塊示例詳解有需要的 朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
15個(gè)高級(jí)Python技巧提高代碼效率更加Pythonic
Python?是一種多用途、功能強(qiáng)大的編程語言,具有廣泛的特性和能力,在本文中,我們將探討?15?個(gè)高級(jí)?Python?技巧,它們有助于改善您的開發(fā)工作流程,并使您的代碼更加高效,更加?Pythonic2023-12-12
Python獲取request response body的方法
本文介紹了使用Python的requests庫(kù)發(fā)送HTTP GET請(qǐng)求并獲取響應(yīng)體的方法,同時(shí),還簡(jiǎn)要介紹了如何使用Flask框架在Python中創(chuàng)建一個(gè)簡(jiǎn)單的網(wǎng)站,感興趣的朋友跟隨小編一起看看吧2024-11-11
Python logging模塊寫入中文出現(xiàn)亂碼

