中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python正則表達式re.compile()和re.findall()怎么使用

發布時間:2022-07-07 13:57:32 來源:億速云 閱讀:185 作者:iii 欄目:開發技術

這篇文章主要介紹了Python正則表達式re.compile()和re.findall()怎么使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Python正則表達式re.compile()和re.findall()怎么使用文章都會有所收獲,下面我們一起來看看吧。

前言

在使用爬蟲提取網頁中的部分信息時,采用到了re.compile()與re.findall()兩種方法,目的:把網頁中的“某某城市土地規劃表”截取并打印出來.

網頁中的代碼:

 <span class='tab-details'>某某城市土地規劃表</span>

提取的方法:

def parse_response(html):
    pattern = re.compile('class=\'tab-details\'>(.*?)</span>',re.S)
    items = re.findall(pattern,html)  
    print(items)
    
    return items

結果:

['某某城市土地規劃表']

這里主要講解pattern,re.compile()與re.findall()的定義及用法:

1.pattern :pattern 屬性規定用于驗證輸入字段的正則表達式。

2.re.compile():compile() 方法用于在腳本執行過程中編譯正則表達式,也可用于改變和重新編譯正則表達式。

舉例:在字符串中全局搜索 "man",并用 "person" 替換。然后通過 compile() 方法,改變正則表達式,用 "person" 替換 "man" 或 "woman",:

<script type="text/javascript">
var str="Every man in the world! Every woman on earth!";
 
patt=/man/g;
str2=str.replace(patt,"person");
//用person取代man
document.write(str2+"<br />");
 
patt=/(wo)?man/g;
patt.compile(patt);
str2=str.replace(patt,"person");
//用person取代man或者woman
document.write(str2);
 
</script>

輸出:(可見第一行中的man都被person取代,出現了woperson,第二行的的man和woman也被person取代,只有person,沒有其他奇奇怪怪的字符串)

Every person in the world! Every woperson on earth!
Every person in the world! Every person on earth!

3.re.findall():額,這個最難搞,主要是為了講解(.*?)

re.findall()函數是返回某種形式(比如String)中所有與pattern匹配的全部字符串,返回形式為數組。

下面是findall()函數的兩種表示形式:(上面的代碼采取的便是第二種形式):

import re
kk = re.compile(r'\d+')
kk.findall('one1two2three3four4')
#[1,2,3,4]
 
#注意此處findall()的用法,可傳兩個參數;
kk = re.compile(r'\d+')
re.findall(kk,"one123")
#[1,2,3]

下面的是常用的正則表達式:

import re
 
str = 'aabbabaabbaa'
 
# 一個"."就是匹配除 \n (換行符)以外的任意一個字符
print(re.findall(r'a.b',str))#['aab', 'aab']
 
# *前面的字符出現0次或以上
print(re.findall(r'a*b',str))#['aab', 'b', 'ab', 'aab', 'b']
 
# 貪婪,匹配從.*前面為開始到后面為結束的所有內容
print(re.findall(r'a.*b',str))#['aabbabaabb']
 
# 非貪婪,遇到開始和結束就進行截取,因此截取多次符合的結果,中間沒有字符也會被截取
print(re.findall(r'a.*?b',str))#['aab', 'ab', 'aab']
 
# 非貪婪,與上面一樣,只是與上面的相比多了一個括號,只保留括號的內容
print(re.findall(r'a(.*?)b',str))#['a', '', 'a']
 
str = '''aabbab
         aabbaa
         bb'''     #后面多加了2個b
 
# 沒有把最后一個換行的aab算進來
print(re.findall(r'a.*?b',str))#['aab', 'ab', 'aab']
 
# re.S不會對\n進行中斷
print(re.findall(r'a.*?b',str,re.S))#['aab', 'ab', 'aab', 'aa\n         b']

注意'.*?'是對它的前后部分作為開始結束部分進行截取,而'(.*?)'也是把其前后作為開始結束,但是只截取括號部分,不包含開始結束部分!!!(同時在對前后部分的選擇時要注意特征明確點,就是與眾不同的的嘛,防止截取出的是其他部分啊)

re.findall中參數re.S的意義:

1.字符串變為(后面多加了2個b)

str = '''aabbab
         aabbaa
         bb'''

2.參數無re.S,沒有把最后一個換行的aab算進來

print(re.findall(r'a.*?b',str))
#['aab', 'ab', 'aab']

3.參數有re.S,不會對\n進行中斷

print(re.findall(r'a.*?b',str,re.S))
#['aab', 'ab', 'aab', 'aa\n         b']

在我們一開始的代碼中就有re.s,因為在爬取網頁的內容時是按照一個一個塊的來爬取,可以理解為并列部分,會存在/n分行符。

def parse_response(html):
    pattern = re.compile('class=\'tab-details\'>(.*?)</span>',re.S)
    items = re.findall(pattern,html)  
    print(items)
    
    return items

關于“Python正則表達式re.compile()和re.findall()怎么使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Python正則表達式re.compile()和re.findall()怎么使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贵德县| 九寨沟县| 霍州市| 科技| 丹阳市| 宁乡县| 潢川县| 德安县| 衡阳市| 崇文区| 遵义市| 本溪市| 神木县| 横峰县| 富宁县| 临西县| 内乡县| 犍为县| 那曲县| 满城县| SHOW| 辽源市| 霞浦县| 县级市| 闸北区| 磐安县| 玉山县| 敦化市| 虎林市| 韩城市| 南召县| 嘉善县| 伽师县| 龙山县| 泗洪县| 隆德县| 德格县| 乐亭县| 三门峡市| 肇东市| 翁源县|