爬蟲第三課 正規表示式

2021-09-08 12:30:23 字數 2683 閱讀 6264

正規表示式可以非常簡潔的表達一組很長字串的特徵,所以把正則表達說成一行勝千言。

可以把一組字串的特徵或特點表達出來。

比如說有一組字串:

無窮多個以l開頭後面有乙個或無窮多個h字串。

『lh』

『lhh』

『lhhh』

…『lhhhhhhh…』

正規表示式: lh+

『py』開頭,後續存在不多於10個字元,後續字元不能是『p』或『h』

這樣的字元有很多,但是如果我們列舉的話會很麻煩,所以可以用正規表示式來表示這組字串的特點:py[^py]

所以可以總結來說正規表示式是通用的字串的表達框架,簡潔表達一組字串的表示式,針對字串表達「簡潔」和「特徵」思想的工具,判斷某字串的特徵歸屬。

操作符說明例項

.表示任何單個字元

字符集,對單個字元給出取值範圍

[a,b,c]表示a,b,c,[a-z]表示a到z單個字母

[^ ]

非字符集,對單個字元給出排除範圍

[^abc] 表示非a或b或c的單個字元

*前乙個字元0次或無限次擴充套件

abc*表示ab,abc,abcc,abccc等

+前乙個字元1次或無限次擴充套件

abc+表示abc,abcc,abccc等

?前乙個字元1次或1次擴充套件

abc?表示ab,abc

|左右表示式任意乙個

abc|def表示abc或def

擴充套件前乙個字母m次

abc表示abbc

擴充套件前乙個字母m次至n次

abc表示 abc、abbc

\d數字,等價於[0-9]

\w單詞字元

等價於[a-za-z0-9]

import re 

data='a1b88888a2b000000a3b00323'

result1=re.findall('a(.*?)b',data,re.s) #提取a、b之間的數字

result2=re.findall('b(.*?)a2',data,re.s) #提取數字88888

#執行結果:

result1=['1','2','3']

result2=['88888']

findall函式第乙個引數是提取的規則,括號內的是我們提取的內容,正規表示式根據括號前後的字元來定位提取資料的位置,括號所在位置代表我們所要提取的資訊所在的位置然後用「(.*?)」代替。第二個引數是提取的物件,第三個引數的作用是可以換行匹配,正規表示式中,「.」的作用是匹配除「\n」以外的任何字元,也就是說,它是在一行中進行匹配。如果不使用re.s引數,則只在每一行內進行匹配,如果一行沒有,就換下一行重新開始,不會跨行。而使用re.s引數以後,正規表示式會將這個字串作為乙個整體,將「\n」當做乙個普通的字元加入到這個字串中,在整體中進行匹配。

上面的例子是一次提取乙個元素,那麼我來看一下如何一次提取兩個元素:

import re 

data='a1b1c---a2b2c---a3b3c---' #提取a、b、c之間的數字

result=re.findall('a(.*?)b(.*?)c',data)

print(result)

#結果[('1', '1'), ('2', '2'), ('3', '3')]

上面就是一次提取兩個元素,這兩個元素放到乙個元組裡,因為被提取的字串中有三個部分的字串滿足了所寫正規表示式的條件,所以一共被提取出了三個元組,最後這三個元組被放到乙個列表裡。

str=『

印度合夥人龍貓』

data=re.findall(『< a href="/films/1215919" title="印度合夥人" data-act="boarditem-click" data-val="">(.*?)

』,str,re.s)

#結果['印度合夥人']

上面正規表示式存在的問題是,它只能提取『印度合夥人』這乙個電影的名字,如果網頁中還有其他電影的名字,則提取不出來,因為上面寫的提取規則只適用於那乙個電影名字。

如果提取物件是下面的樣子:

str=「

印度合夥人龍貓」

data=re.findall(『(.*?)

』,str,re.s)

print(data)

#執行結果

['印度合夥人',『龍貓』]_

這樣就可以將兩個電影名都提取出來,因為寫的提取規則這個兩個電影都適合,「.?」代表任意字元,如果在提取規則裡只寫「.?」而兩邊沒有加括號,則代表在這個位置的字元是什麼都可以,不影響我們要匹配的資訊。

那麼下面我們要一次性提取所有電影的名字和演員的資訊

import re 

data='印度合夥人

主演:阿克謝·庫瑪爾,拉迪卡·艾普特,索娜姆·卡普爾龍貓

主演:帕特·卡洛爾,蒂姆·達利,麗婭·薩隆加

'result=re.findall('title="(.*?)".*?主演:(.*?)<',data,re.s)

print(result)

#執行結果:

[('印度合夥人', '阿克謝·庫瑪爾,拉迪卡·艾普特,索娜姆·卡普爾'), ('龍貓', '帕特·卡洛爾,蒂姆·達利,麗婭·薩隆加')]

這就是正規表示式,下篇文章是關於貓眼電影的爬蟲案例,會有完整的**。

第三課 表示式

lua中的表示式中可以包含數字常量 字面字串 變數 一元和二元操作符及函式呼叫。還可以包括函式定義和table 構造式。算術操作符 二元 指數 取模,lua5.1新增 一元 負號 如 x 0.5 x的平方根 x 1 3 x立方根的倒數 取模操作是根據以下規則定義的 a b a floor a b b...

python第三課答案 python第三課

字串操作 s alexwusir s1 s.capitalize 首字母大寫 print s1 全大寫,全小寫 s2 s.upper s21 s.lower print s2,s21 大小寫翻轉 s3 s.swapcase print s3 每個隔開 特殊字元或數字 的單詞首字母大寫 s alex ...

python第三課答案 python第三課筆記

以下哪個變數的命名不正確?為什麼?a mm 520 b mm520 c 520 mm d 520 mm 答 c不正確,不能數字開頭 在不上機的情況下,以下 你能猜到螢幕會列印什麼內容嗎?myteacher 小甲魚 yourteacher myteacher yourteacher 黑夜 print ...