日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
代碼詳解:Python正則表達(dá)式的優(yōu)秀使用指南

處理文本數(shù)據(jù)的一個(gè)主要任務(wù)就是創(chuàng)建許多以文本為基礎(chǔ)的特性。

成都創(chuàng)新互聯(lián)主營(yíng)芙蓉網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app軟件開(kāi)發(fā)公司,芙蓉h5微信平臺(tái)小程序開(kāi)發(fā)搭建,芙蓉網(wǎng)站營(yíng)銷(xiāo)推廣歡迎芙蓉等地區(qū)企業(yè)咨詢(xún)

人們可能想要在文本中找出特定格式的內(nèi)容,比如找出存在于文本中的電子郵件,或者大型文本中的電話(huà)號(hào)碼。

雖然想要實(shí)現(xiàn)上述功能聽(tīng)起來(lái)很繁瑣,但是如果使用Python正則表達(dá)式模塊,就可以使這一操作更加簡(jiǎn)單。

假設(shè)要在一篇特定的文章中找出標(biāo)點(diǎn)符號(hào)的數(shù)量。以狄更斯的作品文本為例。

你通常會(huì)怎么做?

最簡(jiǎn)單的方法如下:

 
 
 
 
  1. target = [';','.',',','–'] 
  2. string = "It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way – in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only." 
  3. num _ points = 0 
  4. num_puncts = 0 
  5. for punct in target: 
  6.  if punct in string: 
  7.  num_puncts+=string.count(punct)print(num_puncts) 
  8. ------------------------------------------------------------------ 
  9. 19 

如果沒(méi)有可支配的re模塊,那就要用到上面的代碼。但如果有re模塊,則只需兩行代碼:

 
 
 
 
  1. import re 
  2. pattern = r"[;.,–]" 
  3. print(len(re.findall(pattern,string))) 
  4. ------------------------------------------------------------------ 
  5. 19 

本文討論的是最常用的正則表達(dá)式模式,以及一些經(jīng)常使用的正則表達(dá)式函數(shù)。

什么是正則表達(dá)式?

簡(jiǎn)而言之,正則表達(dá)式(regex)用于探索給定字符串中的固定模式。

我們想找到的模式可以是任何東西。

可以創(chuàng)建類(lèi)似于查找電子郵件或手機(jī)號(hào)碼的模式。還可以創(chuàng)建查找以a開(kāi)頭、以z結(jié)尾的字符串的模式。

在上面的例子中:

 
 
 
 
  1. import re 
  2. pattern = r'[,;.,–]' 
  3. 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)建這些模式呢?

創(chuàng)建模式

使用正則表達(dá)式時(shí),首先需要學(xué)習(xí)的是如何創(chuàng)建模式。

接下來(lái)將對(duì)一些最常用的模式進(jìn)行逐一介紹。

可以想到最簡(jiǎn)單的模式是一個(gè)簡(jiǎn)單的字符串。

 
 
 
 
  1. pattern = r'times' 
  2. string = "It was the best of times, it was the worst of times." 
  3. 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的大寫(xiě)字母、從a到z的小寫(xiě)字母和從0到9的數(shù)字。

可以很容易地在Python中運(yùn)行下列代碼:

 
 
 
 
  1. pattern = r'[a-zA-Z]' 
  2. string = "It was the best of times, it was the worst of times." 
  3. print(len(re.findall(pattern,string))) 

除了.findall,正則表達(dá)式還有很多其他功能,稍后會(huì)涉及到。

2.點(diǎn)算符

點(diǎn)運(yùn)算符(.) 用于匹配除換行符以外的任何字符。

運(yùn)算符最大的優(yōu)點(diǎn)是,它們可以結(jié)合使用。

例如,想在字符串中找出以小d或大寫(xiě)D開(kāi)頭,以字母e結(jié)尾,包含6個(gè)字母的子字符串。

3.一些元序列

在使用正則表達(dá)式時(shí),一些模式會(huì)經(jīng)常被用到。因此正則表達(dá)式為這些模式創(chuàng)建了一些快捷方式。最常用的快捷方式如下:

\w,匹配任何字母、數(shù)字或下劃線(xiàn)。相當(dāng)于[a-zA-Z0–9_]

\W,匹配除字母、數(shù)字或下劃線(xiàn)以外的任何內(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開(kāi)頭,以e結(jié)尾的子字符串,d和e之間可以沒(méi)有也可以有多個(gè)字符。我們可以用:d\w*e

如果想找出所有以d開(kāi)頭,以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)匹配字符串的開(kāi)始,而$美元符號(hào)則匹配字符串的結(jié)尾。

6.單詞邊界

這是一個(gè)重要的概念。

有沒(méi)有注意到,在上面的例子中,總是匹配子字符串,而不是匹配單詞?

如果想找出所有以d開(kāi)頭的單詞呢?

可以使用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è)試字符串

輸出:字符串列表。

 
 
 
 
  1. #USAGE: 
  2. pattern = r'[iI]t' 
  3. string = "It was the best of times, it was the worst of times." 
  4. matches = re.findall(pattern,string) 
  5. for match in matches: 
  6. print(match)------------------------------------------------------------ 
  7. It 
  8. it 

2.搜索

輸入:模式和測(cè)試字符串

輸出:首次匹配的位置對(duì)象。

 
 
 
 
  1. #USAGE: 
  2. pattern = r'[iI]t' 
  3. string = "It was the best of times, it was the worst of times." 
  4. location = re.search(pattern,string) 
  5. print(location) 
  6. ------------------------------------------------------------ 
  7. <_sre.SRE_Match object; span=(0, 2), match='It'> 

可以使用下面編程獲取該位置對(duì)象的數(shù)據(jù):

 
 
 
 
  1. print(location.group()) 
  2. ------------------------------------------------------------ 
  3. 'It' 

3.替換

這個(gè)功能也很重要。當(dāng)使用自然語(yǔ)言處理程序時(shí),有時(shí)需要用X替換整數(shù),或者可能需要編輯一些文件。任何文本編輯器中的查找和替換都可以做到。

輸入:搜索模式、替換模式和目標(biāo)字符串

輸出:替換字符串

 
 
 
 
  1. string = "It was the best of times, it was the worst of times." 
  2. string = re.sub(r'times', r'life', string) 
  3. print(string) 
  4. ------------------------------------------------------------ 
  5. It was the best of life, it was the worst of life. 

案例研究

正則表達(dá)式在許多需要驗(yàn)證的情況下都會(huì)用到。我們可能會(huì)在網(wǎng)站上看到類(lèi)似這樣的提示:“這不是有效的電子郵件地址”。雖然可以使用多個(gè)if和else條件來(lái)編寫(xiě)這樣的提示,但正則表達(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)是:上面所有的字母都必須大寫(xiě),字符的順序如下:

那么問(wèn)題是:

“ABcDE1234L”是有效的PAN號(hào)碼嗎?

如果沒(méi)有正則表達(dá)式,該如何回答這個(gè)問(wèn)題呢?可能會(huì)編寫(xiě)一個(gè)for循環(huán),并進(jìn)行遍歷搜索。但如果用正則表達(dá)式,那就像下面這樣簡(jiǎn)單:

 
 
 
 
  1. match=re.search(r’[A-Z]{5}[0–9]{4}[A-Z]’,'ABcDE1234L') 
  2. if match: 
  3.  print(True) 
  4. else: 
  5.  print(False) 
  6. ----------------------------------------------------------------- 
  7. False 

2.查找域名

有時(shí)我們必須從一個(gè)龐大的文本文檔中找出電話(huà)號(hào)碼、電子郵件地址或域名等。

例如,假設(shè)有以下文本:

 
 
 
 
  1.  
  2.  
  3. ^ ["Train (noun)"](http://www.askoxford.com/concise_oed/train?view=uk). (definition – Compact OED). Oxford University Press. Retrieved 2008-03-18. 
  4.  
  5. ^ Atchison, Topeka and Santa Fe Railway (1948). Rules: Operating Department. p. 7. 
  6.  
  7. ^ [Hydrogen trains](http://www.hydrogencarsnow.com/blog2/index.php/hydrogen-vehicles/i-hear-the-hydrogen-train-a-comin-its-rolling-round-the-bend/)
  8.  
  9. ^ [Vehicle Projects Inc. Fuel cell locomotive](http://www.bnsf.com/media/news/articles/2008/01/2008-01-09a.html)
  10.  
  11. ^ Central Japan Railway (2006). Central Japan Railway Data Book 2006. p. 16. 
  12.  
  13. ^ ["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. Retrieved 2008-12-11. 
  14.  
 
  •  

    需要從上面文本中找出這里所有的域名—— askoxford.com;bnsf.com;hydrogencarsnow.com;mrvc.indianrail.gov.in;web.archive.org

    該怎么做?

     
     
     
     
    1. match=re.findall(r'http(s:|:)\/\/(www.|ww2.|)([0-9a-z.A-Z-]*\.\w{2,3})',string) 
    2. for elem in match: 
    3.  print(elem) 
    4. -------------------------------------------------------------------- 
    5. (':', 'www.', 'askoxford.com') 
    6. (':', 'www.', 'hydrogencarsnow.com') 
    7. (':', 'www.', 'bnsf.com') 
    8. (':', '', 'web.archive.org') 
    9. (':', 'www.', 'mrvc.indianrail.gov.in') 
    10. (':', 'www.', 'mrvc.indianrail.gov.in') 

    這里用到了or運(yùn)算符,match返回元組,保留()里的模式部分。

    3.查找電子郵件地址:

    下面的正則表達(dá)式用于在長(zhǎng)文本中查找電子郵件地址。

     
     
     
     
    1. match=re.findall(r'([\w0-9-._]+@[\w0-9-.]+[\w0-9]{2,3})',string) 

    這些都是高級(jí)示例,提供的信息已經(jīng)足夠幫你理解這些示例了。

    結(jié)論

    [[278227]]

    雖然正則表達(dá)式看起來(lái)令人生畏,但它在數(shù)據(jù)操作、創(chuàng)建特性和尋找模式方面具有高度的靈活性。


    文章標(biāo)題:代碼詳解:Python正則表達(dá)式的優(yōu)秀使用指南
    瀏覽路徑:http://www.5511xx.com/article/cdgcgge.html