快使用Ctrl+D收藏本站!如果本站的文章以及資源有幫助到您,希望您能贊助本站服務器費用,感謝您的支持!本站開放注冊,現邀請您一起分享技術心得!您可以-注冊-

Python3.6爬蟲入門自學教程之九:python中的正則表達式學習

Python爬蟲 Julius_wen 324℃ 0評論

天天炫斗洛漓 www.wfrrl.icu 本篇博文將為大家介紹

1.正則表達式介紹

在前面幾篇博文中,我們經過一步步的學習已經可以獲得網頁的HTML全部數據了。但是獲得的數據中包含很多的代碼,非常非常的亂,而我們要想獲得這堆數據中的有用信息,該怎么辦呢?答案是:使用秘密武器——正則表達式。

正則表達式并不是Python的一部分。正則表達式是用于處理字符串的強大工具,擁有自己獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。得益于這一點,在提供了正則表達式的語言里,正則表達式的語法都是一樣的,區別只在于不同的編程語言實現支持的語法數量不同;但不用擔心,不被支持的語法通常是不常用的部分。如果已經在其他語言里使用過正則表達式,只需要簡單看一看就可以上手了。

說實話,正則表達式我看的也是暈乎乎的,可能要多用用才能慢慢適應并且記住吧。我找到一篇教程,感覺講的還可以:https://www.jb51.net/tools/zhengze.html大家可以點擊去看一下,詳細了解一下正則表達式的語法。這里給大家推薦一個在線工具,方便大家以后調試正則表達式://tool.chinaz.com/regex/?qq-pf-to=pcqq.c2c

2.正則表達式的語法規則

這里我強烈建議大家,先看看上面推薦的那篇教程,然后再回過頭來看下面這幅圖。你會明白很多的,不然會很暈的:

3.正則表達式的相關注釋

1.字符串數量的貪婪與非貪婪表示形式

當正則表達式中包含能接受重復的限定符時,通常的行為是(在使整個表達式能得到匹配的前提下)匹配盡可能多的字符。以這個表達式為例:a.*b,它將會匹配最長的以a開始,以b結束的字符串。如果用它來搜索aabab的話,它會匹配整個字符串aabab。這被稱為貪婪匹配。

有時,我們更需要懶惰匹配,也就是匹配盡可能少的字符。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它后面加上一個問號?。這樣.*?就意味著匹配任意數量的重復,但是在能使整個匹配成功的前提下使用最少的重復。現在看看懶惰版的例子吧:

a.*?b匹配最短的,以a開始,以b結束的字符串。如果把它應用于aabab的話,它會匹配aab(第一到第三個字符)ab(第四到第五個字符)。

為什么第一個匹配是aab(第一到第三個字符)而不是ab(第二到第三個字符)?簡單地說,因為正則表達式有另一條規則,比懶惰/貪婪規則的優先級更高:最先開始的匹配擁有最高的優先權——The match that begins earliest wins。

表5.懶惰限定符
代碼/語法 說明
*? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復

2.轉義字符需要額外注意

如果你想查找元字符本身的話,比如你查找.,或者*,就出現了問題:你沒辦法指定它們,因為它們會被解釋成別的意思。這時你就得使用\來取消這些字符的特殊意義。因此,你應該使用\.\*。當然,要查找\本身,你也得用\\.

例如:deerchao\.net匹配deerchao.net,C:\\Windows匹配C:\Windows。

4.正則表達式之Re??槌S梅椒蚪?/h1>

Python 自帶了re???,它提供了對正則表達式的支持。這一節,我們就來大致的了解一下re??櫓械哪諶?。

打開我們常用的python3.6 標準庫網站:https://docs.python.org/3.6/library/re.html,找到6.2章節正則表達式。本節我們要分析的內容全部在這個鏈接里。(很不幸,全是英語……)6.2.1是正則表達式的語法,建議直接看上面第一節和第二節的講解,然后大致簡單瀏覽一下標準庫網站的6.2.1語法說明部分內容。

這里我們要著重看一下6.2.2部分的內容。

Module Contents

The module defines several functions, constants, and an exception. Some of the functions are simplified versions of the full featured methods for compiled regular expressions. Most non-trivial applications always use the compiled form.

該??槎ㄒ辶思父齪?、常量和一個異常。有些函數是編譯正則表達式的全功能方法的簡化版本。大多數重要的應用程序總是使用compiled后的表單。

其主要包括以下方法:(ps:這些內容,在標準庫網站都能找到,只不過全是英文的……)

1.re.match(pattern, string[, flags])

如果字符串開頭的零或多個字符與正則表達式模式匹配,則返回相應的匹配對象。如果字符串與模式不匹配,則返回None;注意,這與零長度匹配不同。

即使在多行模式下,re.match()也只會在字符串的開頭匹配,而不會在每行的開頭匹配。 如果您想要在字符串中的任何地方找到匹配項,請使用search()(參見search()和match()))。

2.re.search(pattern, string, flags=0)

掃描字符串,查找正則表達式模式產生匹配的第一個位置,并返回相應的匹配對象。如果字符串中沒有與模式匹配的位置,則返回None;注意,這與在字符串的某個點找到零長度匹配是不同的。

3.re.split(pattern, string, maxsplit=0, flags=0)

通過模式的出現分割字符串。如果在模式中使用捕獲括號,那么模式中所有組的文本也將作為結果列表的一部分返回。如果maxsplit是非零的,那么最多會發生maxsplit split,并且字符串的其余部分作為列表的最后元素返回。

4.re.findall(pattern, string, flags=0)

返回字符串中所有模式的非重疊匹配,如字符串列表。從左到右掃描字符串,并按找到的順序返回匹配項。如果模式中存在一個或多個組,則返回組列表;如果模式有多個組,這將是一個元組列表。結果中包含空匹配項。

5.re.finditer(pattern, string, flags=0)

返回一個迭代器,在字符串中的所有非重疊匹配中產生匹配對象。從左到右掃描字符串,并按找到的順序返回匹配項。結果中包含空匹配項。請參見關于findall()的說明。

還有三個不一一介紹了,大家自己打開標準庫鏈接進行學習查看。

大家應該注意到re.findall(pattern, string, flags=0),每一個方法括號中傳入的參數都有一個flag,這個flag參數可選值,在上面提到的標準庫說明鏈接中都有詳細說明和介紹,大家自己去看。參數flag是匹配模式,取值可以使用按位或運算符’|’表示同時生效,比如re.I | re.M。

5.幾個常用方法詳細解析

上面re??櫓械?個方法,均需要傳入pattern參數,注:以上8個方法中的flags同樣是代表匹配模式的意思,如果在pattern生成時已經指明了flags,那么在下面的方法中就不需要傳入這個參數了。

下面詳細介紹一下這8個方法:

1.re.match(pattern, string[, flags])

1.re.match(pattern, string[, flags])

如果字符串開頭的零或多個字符與正則表達式模式匹配,則返回相應的匹配對象。如果字符串與模式不匹配,則返回None;注意,這與零長度匹配不同。

即使在多行模式下,re.match()也只會在字符串的開頭匹配,而不會在每行的開頭匹配。 如果您想要在字符串中的任何地方找到匹配項,請使用search()(參見search()和match()))。

運行結果如下:

我們還看到最后打印出了result.group(),這個是什么意思呢?下面我們說一下關于match對象的的屬性和方法
Match對象是一次匹配的結果,包含了很多關于此次匹配的信息,可以使用Match提供的可讀屬性或方法來獲取這些信息

在上面提到的python標準庫6.2.4部分,有關于match對象的講解,這個對象有一些對應的方法可以調用。這里希望大家能自己打開下面下面這個鏈接進行學習了解:https://docs.python.org/3.6/library/re.html#re.findall找到6.2.4

屬性:
1.string: 匹配時使用的文本。
2.re: 匹配時使用的Pattern對象。
3.pos: 文本中正則表達式開始搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數相同。
4.endpos: 文本中正則表達式結束搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數相同。
5.lastindex: 最后一個被捕獲的分組在文本中的索引。如果沒有被捕獲的分組,將為None。
6.lastgroup: 最后一個被捕獲的分組的別名。如果這個分組沒有別名或者沒有被捕獲的分組,將為None。

方法:
1.group([group1, …]):
獲得一個或多個分組截獲的字符串;指定多個參數時將以元組形式返回。group1可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫參數時,返回group(0);沒有截獲字符串的組返回None;截獲了多次的組返回最后一次截獲的子串。
2.groups([default]):
以元組形式返回全部分組截獲的字符串。相當于調用group(1,2,…last)。default表示沒有截獲字符串的組以這個值替代,默認為None。
3.groupdict([default]):
返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒有別名的組不包含在內。default含義同上。
4.start([group]):
返回指定的組截獲的子串在string中的起始索引(子串第一個字符的索引)。group默認值為0。
5.end([group]):
返回指定的組截獲的子串在string中的結束索引(子串最后一個字符的索引+1)。group默認值為0。
6.span([group]):
返回(start(group), end(group))。
7.expand(template):
將匹配到的分組代入template中然后返回。template中可以使用\id或\g、\g引用分組,但不能使用編號0。\id與\g是等價的;但\10將被認為是第10個分組,如果你想表達\1之后是字符’0’,只能使用\g0。

這些內容,在上面提到鏈接6.2.4有詳細的介紹,大家可以去看看。

2.re.search(pattern, string, flags=0)

2.re.search(pattern, string, flags=0)

掃描字符串,查找正則表達式模式產生匹配的第一個位置,并返回相應的匹配對象。如果字符串中沒有與模式匹配的位置,則返回None;注意,這與在字符串的某個點找到零長度匹配是不同的。

3.re.fullmatch(pattern, string, flags=0)

如果整個字符串匹配正則表達式模式,則返回相應的匹配對象。如果字符串與模式不匹配,則返回None;注意,這與零長度匹配不同。必須是全詞匹配。

4.re.split(pattern, string, maxsplit=0, flags=0)

按照能夠匹配的子串將string分割后返回列表。maxsplit用于指定最大分割次數,不指定將全部分割。我們通過下面的例子感受一下。

5.re.findall(pattern, string, flags=0)

對應的運行結果如下:

6.re.finditer(pattern, string, flags=0)

搜索string,返回一個順序訪問每一個匹配結果(Match對象)的迭代器(索引)。我們通過下面的例子來感受一下

7.re.sub(pattern, repl, string, count=0, flags=0)

使用repl替換string中每一個匹配的子串后返回替換后的字符串。當repl是一個字符串時,可以使用\id或\g、\g引用分組,但不能使用編號0。當repl是一個方法時,這個方法應當只接受一個參數(Match對象),并返回一個字符串用于替換(返回的字符串中不能再引用分組)。
count用于指定最多替換次數,不指定時全部替換。

8.re.subn(pattern, repl, string, count=0, flags=0)

返回 (sub(repl, string[, count]), 替換次數)。

6.本篇小結

這篇博文,本人在寫的過程中大約也用了7個小時左右。我在寫的過程中也加深了自己對正則表達式的理解,感謝大家的支持,下面的博文將帶大家一起做一些小項目練手了。

轉載請注明:天天炫斗洛漓 » Python3.6爬蟲入門自學教程之九:python中的正則表達式學習

贊賞作者

微信贊賞支付寶贊賞

喜歡 (1)or分享 (0)

如果您喜歡本站文章,感覺本站的資源對您有幫助,請狠狠點擊下面

每累計贊助40元,即可讓本站按最低配置運行一個月,感謝您的支持!

發表我的評論
取消評論

表情

Hi,您需要填寫昵稱和郵箱!

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址