您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python正則表達(dá)式的使用方法是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Python正則表達(dá)式的使用方法是什么”吧!
簡(jiǎn)而言之,正則表達(dá)式(regex)用于探索給定字符串中的固定模式。
我們想找到的模式可以是任何東西。
可以創(chuàng)建類似于查找電子郵件或手機(jī)號(hào)碼的模式。還可以創(chuàng)建查找以a開頭、以z結(jié)尾的字符串的模式。
在上面的例子中:
import re pattern = r'[,;.,–]' print(len(re.findall(pattern,string)))
我們想找出的模式是 r’[,;.,–]’。這個(gè)模式可找出想要的4個(gè)字符中的任何一個(gè)。regex101是一個(gè)用于測(cè)試模式的工具。將模式應(yīng)用到目標(biāo)字符串時(shí),呈現(xiàn)出以下界面。
如圖所示,可以在目標(biāo)字符串中根據(jù)需要找到,;.,–。
每當(dāng)需要測(cè)試正則表達(dá)式時(shí),都會(huì)用到上面的工具。這比一次又一次運(yùn)行python要快得多,調(diào)試也容易得多。
現(xiàn)在我們已經(jīng)可以在目標(biāo)字符串中找到這些模式,那么如何真正創(chuàng)建這些模式呢?
使用正則表達(dá)式時(shí),首先需要學(xué)習(xí)的是如何創(chuàng)建模式。
接下來(lái)將對(duì)一些最常用的模式進(jìn)行逐一介紹。
可以想到最簡(jiǎn)單的模式是一個(gè)簡(jiǎn)單的字符串。
pattern = r'times' string = "It was the best of times, it was the worst of times." print(len(re.findall(pattern,string)))
但這并不是很有用。為了幫助創(chuàng)建復(fù)雜的模式,正則表達(dá)式提供了特殊的字符/操作符。下面來(lái)逐個(gè)看看這些操作符。請(qǐng)等待gif加載。
1.[]操作符
這在第一個(gè)例子中使用過(guò),可用于找到符合這些方括號(hào)中條件的一個(gè)字符。
[abc]-將查找文本中出現(xiàn)的所有a、b或c
[a-z]-將查找文本中出現(xiàn)的所有從a到z的字母
[a-z0–9A-Z]-將查找文本中出現(xiàn)的所有從A到Z的大寫字母、從a到z的小寫字母和從0到9的數(shù)字。
可以很容易地在Python中運(yùn)行下列代碼:
pattern = r'[a-zA-Z]' string = "It was the best of times, it was the worst of times." print(len(re.findall(pattern,string)))
除了.findall,正則表達(dá)式還有很多其他功能,稍后會(huì)涉及到。
2.點(diǎn)算符
點(diǎn)運(yùn)算符(.) 用于匹配除換行符以外的任何字符。
運(yùn)算符最大的優(yōu)點(diǎn)是,它們可以結(jié)合使用。
例如,想在字符串中找出以小d或大寫D開頭,以字母e結(jié)尾,包含6個(gè)字母的子字符串。
3.一些元序列
在使用正則表達(dá)式時(shí),一些模式會(huì)經(jīng)常被用到。因此正則表達(dá)式為這些模式創(chuàng)建了一些快捷方式。最常用的快捷方式如下:
\w,匹配任何字母、數(shù)字或下劃線。相當(dāng)于[a-zA-Z0–9_]
\W,匹配除字母、數(shù)字或下劃線以外的任何內(nèi)容。
\d,匹配任何十進(jìn)制數(shù)字。相當(dāng)于[0–9]。
\D,匹配除十進(jìn)制數(shù)字以外的任何數(shù)字。
4.加號(hào)和星形運(yùn)算符
點(diǎn)算符只是用于獲取任何字符的單個(gè)實(shí)例。如果想找出更多實(shí)例要怎么做呢?
加號(hào)+用于表示最左邊字符的一個(gè)或多個(gè)實(shí)例。
星號(hào)*用于表示最左邊字符的0個(gè)或多個(gè)實(shí)例。
例如,如果想找出所有以d開頭,以e結(jié)尾的子字符串,d和e之間可以沒(méi)有也可以有多個(gè)字符。我們可以用:d\w*e
如果想找出所有以d開頭,以e結(jié)尾的子字符串,在d和e之間至少有一個(gè)字符,我們可以用:d\w+e
還可以使用更為通用的方法:用{}
\w{n} - 重復(fù)\w 正好n次。
\w{n,} - 重復(fù)\w至少n次,或者更多次。
\w{n1, n2} - 重復(fù) \w 至少n1次,但不超過(guò)n2次。
5.^插入符號(hào)和$美元符號(hào)。
^插入符號(hào)匹配字符串的開始,而$美元符號(hào)則匹配字符串的結(jié)尾。
6.單詞邊界
這是一個(gè)重要的概念。
有沒(méi)有注意到,在上面的例子中,總是匹配子字符串,而不是匹配單詞?
如果想找出所有以d開頭的單詞呢?
可以使用d\w*模式嗎?下面用網(wǎng)絡(luò)工具來(lái)試一試吧。
正則表達(dá)式函數(shù)
目前為止,只使用了 re包中的findall 函數(shù),其實(shí)還有很多其他函數(shù)。下面來(lái)逐個(gè)介紹。
1. findall
上面已經(jīng)使用了 findall。這是我最常使用的一個(gè)。下面來(lái)正式認(rèn)識(shí)一下這個(gè)函數(shù)吧。
輸入:模式和測(cè)試字符串
輸出:字符串列表。
#USAGE: pattern = r'[iI]t' string = "It was the best of times, it was the worst of times." matches = re.findall(pattern,string) for match in matches: print(match)------------------------------------------------------------ It it
2.搜索
輸入:模式和測(cè)試字符串
輸出:首次匹配的位置對(duì)象。
#USAGE: pattern = r'[iI]t' string = "It was the best of times, it was the worst of times." location = re.search(pattern,string) print(location) ------------------------------------------------------------ <_sre.SRE_Match object; span=(0, 2), match='It'>
可以使用下面編程獲取該位置對(duì)象的數(shù)據(jù):
print(location.group()) ------------------------------------------------------------ 'It'
3.替換
這個(gè)功能也很重要。當(dāng)使用自然語(yǔ)言處理程序時(shí),有時(shí)需要用X替換整數(shù),或者可能需要編輯一些文件。任何文本編輯器中的查找和替換都可以做到。
輸入:搜索模式、替換模式和目標(biāo)字符串
輸出:替換字符串
string = "It was the best of times, it was the worst of times."
string = re.sub(r'times', r'life', string)
print(string)
------------------------------------------------------------
It was the best of life, it was the worst of life.
正則表達(dá)式在許多需要驗(yàn)證的情況下都會(huì)用到。我們可能會(huì)在網(wǎng)站上看到類似這樣的提示:“這不是有效的電子郵件地址”。雖然可以使用多個(gè)if和else條件來(lái)編寫這樣的提示,但正則表達(dá)式可能更具優(yōu)勢(shì)。
1.PAN編號(hào)
在美國(guó),SSN(社會(huì)安全號(hào)碼)是用于稅務(wù)識(shí)別的號(hào)碼,而在印度,稅務(wù)識(shí)別用的則是 PAN號(hào)碼。PAN的基本驗(yàn)證標(biāo)準(zhǔn)是:上面所有的字母都必須大寫,字符的順序如下:
那么問(wèn)題是:
“ABcDE1234L”是有效的PAN號(hào)碼嗎?
如果沒(méi)有正則表達(dá)式,該如何回答這個(gè)問(wèn)題呢?可能會(huì)編寫一個(gè)for循環(huán),并進(jìn)行遍歷搜索。但如果用正則表達(dá)式,那就像下面這樣簡(jiǎn)單:
match=re.search(r’[A-Z]{5}[0–9]{4}[A-Z]’,'ABcDE1234L') if match: print(True) else: print(False) ----------------------------------------------------------------- False
2.查找域名
有時(shí)我們必須從一個(gè)龐大的文本文檔中找出電話號(hào)碼、電子郵件地址或域名等。
例如,假設(shè)有以下文本:
<div class="reflist" style="list-style-type: decimal;"> <ol class="references"> <li id="cite_note-1"><span class="mw-cite-backlink"><b>^ ["Train (noun)"](http://www.askoxford.com/concise_oed/train?view=uk). <i>(definition – Compact OED)</i>. Oxford University Press<span class="reference-accessdate">. Retrieved 2008-03-18</span>.</span><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fen.wikipedia.org%3ATrain&rft.atitle=Train+%28noun%29&rft.genre=article&rft_id=http%3A%2F%2Fwww.askoxford.com%2Fconcise_oed%2Ftrain%3Fview%3Duk&rft.jtitle=%28definition+%E2%80%93+Compact+OED%29&rft.pub=Oxford+University+Press&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal" class="Z3988"><span style="display:none;"> </span></span></span></li> <li id="cite_note-2"><span class="mw-cite-backlink"><b>^</b></span> <span class="reference-text"><span class="citation book">Atchison, Topeka and Santa Fe Railway (1948). <i>Rules: Operating Department</i>. p. 7.</span><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fen.wikipedia.org%3ATrain&rft.au=Atchison%2C+Topeka+and+Santa+Fe+Railway&rft.aulast=Atchison%2C+Topeka+and+Santa+Fe+Railway&rft.btitle=Rules%3A+Operating+Department&rft.date=1948&rft.genre=book&rft.pages=7&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook" class="Z3988"><span style="display:none;"> </span></span></span></li> <li id="cite_note-3"><span class="mw-cite-backlink"><b>^ [Hydrogen trains](http://www.hydrogencarsnow.com/blog2/index.php/hydrogen-vehicles/i-hear-the-hydrogen-train-a-comin-its-rolling-round-the-bend/)</span></li> <li id="cite_note-4"><span class="mw-cite-backlink"><b>^ [Vehicle Projects Inc. Fuel cell locomotive](http://www.bnsf.com/media/news/articles/2008/01/2008-01-09a.html)</span></li> <li id="cite_note-5"><span class="mw-cite-backlink"><b>^</b></span> <span class="reference-text"><span class="citation book">Central Japan Railway (2006). <i>Central Japan Railway Data Book 2006</i>. p. 16.</span><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fen.wikipedia.org%3ATrain&rft.au=Central+Japan+Railway&rft.aulast=Central+Japan+Railway&rft.btitle=Central+Japan+Railway+Data+Book+2006&rft.date=2006&rft.genre=book&rft.pages=16&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook" class="Z3988"><span style="display:none;"> </span></span></span></li> <li id="cite_note-6"><span class="mw-cite-backlink"><b>^ ["Overview Of the existing Mumbai Suburban Railway"](http://web.archive.org/web/20080620033027/http://www.mrvc.indianrail.gov.in/overview.htm). _Official webpage of Mumbai Railway Vikas Corporation_. Archived from [the original](http://www.mrvc.indianrail.gov.in/overview.htm) on 2008-06-20<span class="reference-accessdate">. Retrieved 2008-12-11</span>.</span><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fen.wikipedia.org%3ATrain&rft.atitle=Overview+Of+the+existing+Mumbai+Suburban+Railway&rft.genre=article&rft_id=http%3A%2F%2Fwww.mrvc.indianrail.gov.in%2Foverview.htm&rft.jtitle=Official+webpage+of+Mumbai+Railway+Vikas+Corporation&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal" class="Z3988"><span style="display:none;"> </span></span></span></li> </ol> </div>
需要從上面文本中找出這里所有的域名—— askoxford.com;bnsf.com;hydrogencarsnow.com;mrvc.indianrail.gov.in;web.archive.org
該怎么做?
match=re.findall(r'http(s:|:)\/\/(www.|ww2.|)([0-9a-z.A-Z-]*\.\w{2,3})',string) for elem in match: print(elem) -------------------------------------------------------------------- (':', 'www.', 'askoxford.com') (':', 'www.', 'hydrogencarsnow.com') (':', 'www.', 'bnsf.com') (':', '', 'web.archive.org') (':', 'www.', 'mrvc.indianrail.gov.in') (':', 'www.', 'mrvc.indianrail.gov.in')
這里用到了or運(yùn)算符,match返回元組,保留()里的模式部分。
3.查找電子郵件地址:
下面的正則表達(dá)式用于在長(zhǎng)文本中查找電子郵件地址。
match=re.findall(r'([\w0-9-._]+@[\w0-9-.]+[\w0-9]{2,3})',string)
這些都是高級(jí)示例,提供的信息已經(jīng)足夠幫你理解這些示例了。
感謝各位的閱讀,以上就是“Python正則表達(dá)式的使用方法是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Python正則表達(dá)式的使用方法是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。