国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

python 基礎(chǔ)概念整理

2019-11-14 11:54:23
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

正則表達(dá)式中 字符串前面加r,表示的意思是禁止字符串轉(zhuǎn)義

>>>PRint"asfdas/n"asfdas>>>print"asfdas//n"asfdas/n>>>print"asfdas/n"asfdas>>>printr"asfdas/n"asfdas/n

urllib  庫(kù)

importurllib2 response=urllib2.urlopen("http://www.baidu.com")printresponse.read()

構(gòu)造request

importurllib2 request=urllib2.Request("http://www.baidu.com")response=urllib2.urlopen(request)printresponse.read()

post 傳數(shù)據(jù) 模擬登錄

3456789importurllibimporturllib2 values={"username":"1016903103@QQ.com","passWord":"XXXX"}data=urllib.urlencode(values)url="https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"request=urllib2.Request(url,data)response=urllib2.urlopen(request)printresponse.read()

get傳數(shù)據(jù)

importurllibimporturllib2 values={}values['username']="1016903103@qq.com"values['password']="XXXX"data=urllib.urlencode(values)url="http://passport.csdn.net/account/login"geturl=url+"?"+datarequest=urllib2.Request(geturl)response=urllib2.urlopen(request)printresponse.read()

設(shè)置header

importurllib  importurllib2   url='http://www.server.com/login'user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  values={'username':'cqc',  'password':'XXXX'}  headers={'User-Agent':user_agent}  data=urllib.urlencode(values)  request=urllib2.Request(url,data,headers)  response=urllib2.urlopen(request)  page=response.read()

另外headers的一些屬性,下面的需要特別注意一下:

User-Agent : 有些服務(wù)器或 Proxy 會(huì)通過(guò)該值來(lái)判斷是否是瀏覽器發(fā)出的請(qǐng)求Content-Type : 在使用 REST 接口時(shí),服務(wù)器會(huì)檢查該值,用來(lái)確定 HTTP Body 中的內(nèi)容該怎樣解析。application/xml : 在 XML RPC,如 RESTful/SOAP 調(diào)用時(shí)使用application/json : 在 JSON RPC 調(diào)用時(shí)使用application/x-www-form-urlencoded : 瀏覽器提交 Web 表單時(shí)使用在使用服務(wù)器提供的 RESTful 或 SOAP 服務(wù)時(shí), Content-Type 設(shè)置錯(cuò)誤會(huì)導(dǎo)致服務(wù)器拒絕服務(wù)

其他的有必要的可以審查瀏覽器的headers內(nèi)容,在構(gòu)建時(shí)寫入同樣的數(shù)據(jù)即可。

1.URLError

首先解釋下URLError可能產(chǎn)生的原因:

網(wǎng)絡(luò)無(wú)連接,即本機(jī)無(wú)法上網(wǎng)連接不到特定的服務(wù)器服務(wù)器不存在

在代碼中,我們需要用try-except語(yǔ)句來(lái)包圍并捕獲相應(yīng)的異常。下面是一個(gè)例子,先感受下它的風(fēng)騷

importurllib2 requset=urllib2.Request('http://www.xxxxx.com')try:    urllib2.urlopen(requset)excepturllib2.URLError,e:    printe.reason

我們利用了 urlopen方法訪問(wèn)了一個(gè)不存在的網(wǎng)址,運(yùn)行結(jié)果如下:

Python
1[Errno 11004] getaddrinfo failed

它說(shuō)明了錯(cuò)誤代號(hào)是11004,錯(cuò)誤原因是 getaddrinfo failed

2.HTTPError

HTTPError是URLError的子類,在你利用urlopen方法發(fā)出一個(gè)請(qǐng)求時(shí),服務(wù)器上都會(huì)對(duì)應(yīng)一個(gè)應(yīng)答對(duì)象response,其中它包含一個(gè)數(shù)字”狀態(tài)碼”。舉個(gè)例子,假如response是一個(gè)”重定向”,需定位到別的地址獲取文檔,urllib2將對(duì)此進(jìn)行處理。

其他不能處理的,urlopen會(huì)產(chǎn)生一個(gè)HTTPError,對(duì)應(yīng)相應(yīng)的狀態(tài)嗎,HTTP狀態(tài)碼表示HTTP協(xié)議所返回的響應(yīng)的狀態(tài)。下面將狀態(tài)碼歸結(jié)如下:

100:繼續(xù) 客戶端應(yīng)當(dāng)繼續(xù)發(fā)送請(qǐng)求。客戶端應(yīng)當(dāng)繼續(xù)發(fā)送請(qǐng)求的剩余部分,或者如果請(qǐng)求已經(jīng)完成,忽略這個(gè)響應(yīng)。

101: 轉(zhuǎn)換協(xié)議 在發(fā)送完這個(gè)響應(yīng)最后的空行后,服務(wù)器將會(huì)切換到在Upgrade 消息頭中定義的那些協(xié)議。只有在切換新的協(xié)議更有好處的時(shí)候才應(yīng)該采取類似措施。

102:繼續(xù)處理 由WebDAV(RFC 2518)擴(kuò)展的狀態(tài)碼,代表處理將被繼續(xù)執(zhí)行。

200:請(qǐng)求成功 處理方式:獲得響應(yīng)的內(nèi)容,進(jìn)行處理

201:請(qǐng)求完成,結(jié)果是創(chuàng)建了新資源。新創(chuàng)建資源的URI可在響應(yīng)的實(shí)體中得到 處理方式:爬蟲中不會(huì)遇到

202:請(qǐng)求被接受,但處理尚未完成 處理方式:阻塞等待

204:服務(wù)器端已經(jīng)實(shí)現(xiàn)了請(qǐng)求,但是沒有返回新的信 息。如果客戶是用戶代理,則無(wú)須為此更新自身的文檔視圖。 處理方式:丟棄

300:該狀態(tài)碼不被HTTP/1.0的應(yīng)用程序直接使用, 只是作為3XX類型回應(yīng)的默認(rèn)解釋。存在多個(gè)可用的被請(qǐng)求資源。 處理方式:若程序中能夠處理,則進(jìn)行進(jìn)一步處理,如果程序中不能處理,則丟棄301:請(qǐng)求到的資源都會(huì)分配一個(gè)永久的URL,這樣就可以在將來(lái)通過(guò)該URL來(lái)訪問(wèn)此資源 處理方式:重定向到分配的URL

302:請(qǐng)求到的資源在一個(gè)不同的URL處臨時(shí)保存 處理方式:重定向到臨時(shí)的URL

304:請(qǐng)求的資源未更新 處理方式:丟棄

400:非法請(qǐng)求 處理方式:丟棄

401:未授權(quán) 處理方式:丟棄

403:禁止 處理方式:丟棄

404:沒有找到 處理方式:丟棄

500:服務(wù)器內(nèi)部錯(cuò)誤 服務(wù)器遇到了一個(gè)未曾預(yù)料的狀況,導(dǎo)致了它無(wú)法完成對(duì)請(qǐng)求的處理。一般來(lái)說(shuō),這個(gè)問(wèn)題都會(huì)在服務(wù)器端的源代碼出現(xiàn)錯(cuò)誤時(shí)出現(xiàn)。

501:服務(wù)器無(wú)法識(shí)別 服務(wù)器不支持當(dāng)前請(qǐng)求所需要的某個(gè)功能。當(dāng)服務(wù)器無(wú)法識(shí)別請(qǐng)求的方法,并且無(wú)法支持其對(duì)任何資源的請(qǐng)求。

502:錯(cuò)誤網(wǎng)關(guān) 作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí),從上游服務(wù)器接收到無(wú)效的響應(yīng)。

503:服務(wù)出錯(cuò) 由于臨時(shí)的服務(wù)器維護(hù)或者過(guò)載,服務(wù)器當(dāng)前無(wú)法處理請(qǐng)求。這個(gè)狀況是臨時(shí)的,并且將在一段時(shí)間以后恢復(fù)。

HTTPError實(shí)例產(chǎn)生后會(huì)有一個(gè)code屬性,這就是是服務(wù)器發(fā)送的相關(guān)錯(cuò)誤號(hào)。因?yàn)閡rllib2可以為你處理重定向,也就是3開頭的代號(hào)可以被處理,并且100-299范圍的號(hào)碼指示成功,所以你只能看到400-599的錯(cuò)誤號(hào)碼。

下面我們寫一個(gè)例子來(lái)感受一下,捕獲的異常是HTTPError,它會(huì)帶有一個(gè)code屬性,就是錯(cuò)誤代號(hào),另外我們又打印了reason屬性,這是它的父類URLError的屬性。

Python
12345678importurllib2 req=urllib2.Request('http://blog.csdn.net/cqcre')try:    urllib2.urlopen(req)excepturllib2.HTTPError,e:    printe.code    printe.reason

運(yùn)行結(jié)果如下

Python
12403Forbidden

錯(cuò)誤代號(hào)是403,錯(cuò)誤原因是Forbidden,說(shuō)明服務(wù)器禁止訪問(wèn)。

我們知道,HTTPError的父類是URLError,根據(jù)編程經(jīng)驗(yàn),父類的異常應(yīng)當(dāng)寫到子類異常的后面,如果子類捕獲不到,那么可以捕獲父類的異常,所以上述的代碼可以這么改寫

Python
1234567891011importurllib2 req=urllib2.Request('http://blog.csdn.net/cqcre')try:    urllib2.urlopen(req)excepturllib2.HTTPError,e:    printe.codeexcepturllib2.URLError,e:    printe.reasonelse:    print"OK"

如果捕獲到了HTTPError,則輸出code,不會(huì)再處理URLError異常。如果發(fā)生的不是HTTPError,則會(huì)去捕獲URLError異常,輸出錯(cuò)誤原因。

另外還可以加入 hasattr屬性提前對(duì)屬性進(jìn)行判斷,代碼改寫如下

Python
123456789101112import urllib2 req = urllib2.Request('http://blog.csdn.net/cqcre')try:    urllib2.urlopen(req)except urllib2.URLError, e:    if hasattr(e,"code"):        print e.code    if hasattr(e,"reason"):        print e.reasonelse:    print "OK"

首先對(duì)異常的屬性進(jìn)行判斷,以免出現(xiàn)屬性輸出報(bào)錯(cuò)的現(xiàn)象。

為什么要使用Cookie呢?

Cookie,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行session跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過(guò)加密)

比如說(shuō)有些網(wǎng)站需要登錄后才能訪問(wèn)某個(gè)頁(yè)面,在登錄之前,你想抓取某個(gè)頁(yè)面內(nèi)容是不允許的。那么我們可以利用Urllib2庫(kù)保存我們登錄的Cookie,然后再抓取其他頁(yè)面就達(dá)到目的了。

1.Opener

當(dāng)你獲取一個(gè)URL你使用一個(gè)opener(一個(gè)urllib2.OpenerDirector的實(shí)例)。在前面,我們都是使用的默認(rèn)的opener,也就是urlopen。它是一個(gè)特殊的opener,可以理解成opener的一個(gè)特殊實(shí)例,傳入的參數(shù)僅僅是url,data,timeout。

如果我們需要用到Cookie,只用這個(gè)opener是不能達(dá)到目的的,所以我們需要?jiǎng)?chuàng)建更一般的opener來(lái)實(shí)現(xiàn)對(duì)Cookie的設(shè)置。

2.Cookielib

cookielib模塊的主要作用是提供可存儲(chǔ)cookie的對(duì)象,以便于與urllib2模塊配合使用來(lái)訪問(wèn)Internet資源。 Cookielib模塊非常強(qiáng)大,我們可以利用本模塊的CookieJar類的對(duì)象來(lái)捕獲cookie并在后續(xù)連接請(qǐng)求時(shí)重新發(fā)送,比如可以實(shí)現(xiàn)模擬登錄 功能。該模塊主要的對(duì)象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

它們的關(guān)系:CookieJar —-派生—->FileCookieJar —-派生—–>MozillaCookieJar和LWPCookieJar

1)獲取Cookie保存到變量

首先,我們先利用CookieJar對(duì)象實(shí)現(xiàn)獲取cookie的功能,存儲(chǔ)到變量中,先來(lái)感受一下

Python
12345678910111213importurllib2importcookielib#聲明一個(gè)CookieJar對(duì)象實(shí)例來(lái)保存cookiecookie=cookielib.CookieJar()#利用urllib2庫(kù)的HTTPCookieProcessor對(duì)象來(lái)創(chuàng)建cookie處理器handler=urllib2.HTTPCookieProcessor(cookie)#通過(guò)handler來(lái)構(gòu)建openeropener=urllib2.build_opener(handler)#此處的open方法同urllib2的urlopen方法,也可以傳入requestresponse=opener.open('http://www.baidu.com')foritemincookie:    print'Name = '+item.name    print'Value = '+item.value

我們使用以上方法將cookie保存到變量中,然后打印出了cookie中的值,運(yùn)行結(jié)果如下

Python
12345678910Name = BAIDUIDValue = B07B663B645729F11F659C02AAE65B4C:FG=1Name = BAIDUPSIDValue = B07B663B645729F11F659C02AAE65B4CName = H_PS_PSSIDValue = 12527_11076_1438_10633Name = BDSVRTMValue = 0Name = BD_HOMEValue = 0

2)保存Cookie到文件

在上面的方法中,我們將cookie保存到了cookie這個(gè)變量中,如果我們想將cookie保存到文件中該怎么做呢?這時(shí),我們就要用到

FileCookieJar這個(gè)對(duì)象了,在這里我們使用它的子類MozillaCookieJar來(lái)實(shí)現(xiàn)Cookie的保存

Python
123456789101112131415importcookielibimporturllib2 #設(shè)置保存cookie的文件,同級(jí)目錄下的cookie.txtfilename='cookie.txt'#聲明一個(gè)MozillaCookieJar對(duì)象實(shí)例來(lái)保存cookie,之后寫入文件cookie=cookielib.MozillaCookieJar(filename)#利用urllib2庫(kù)的HTTPCookieProcessor對(duì)象來(lái)創(chuàng)建cookie處理器handler=urllib2.HTTPCookieProcessor(cookie)#通過(guò)handler來(lái)構(gòu)建openeropener=urllib2.build_opener(handler)#創(chuàng)建一個(gè)請(qǐng)求,原理同urllib2的urlopenresponse=opener.open("http://www.baidu.com")#保存cookie到文件cookie.save(ignore_discard=True,ignore_expires=True)

3)從文件中獲取Cookie并訪問(wèn)

那么我們已經(jīng)做到把Cookie保存到文件中了,如果以后想使用,可以利用下面的方法來(lái)讀取cookie并訪問(wèn)網(wǎng)站,感受一下

Python
12345678910111213import cookielibimport urllib2 #創(chuàng)建MozillaCookieJar實(shí)例對(duì)象cookie = cookielib.MozillaCookieJar()#從文件中讀取cookie內(nèi)容到變量cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)#創(chuàng)建請(qǐng)求的requestreq = urllib2.Request("http://www.baidu.com")#利用urllib2的build_opener方法創(chuàng)建一個(gè)openeropener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))response = opener.open(req)print response.read()

設(shè)想,如果我們的 cookie.txt 文件中保存的是某個(gè)人登錄百度的cookie,那么我們提取出這個(gè)cookie文件內(nèi)容,就可以用以上方法模擬這個(gè)人的賬號(hào)登錄百度。

4)利用cookie模擬網(wǎng)站登錄

下面我們以我們學(xué)校的教育系統(tǒng)為例,利用cookie實(shí)現(xiàn)模擬登錄,并將cookie信息保存到文本文件中,來(lái)感受一下cookie大法吧!

注意:密碼我改了啊,別偷偷登錄本宮的選課系統(tǒng) o(╯□╰)o

Python
1234567891011121314151617181920212223importurllibimporturllib2importcookielib filename='cookie.txt'#聲明一個(gè)MozillaCookieJar對(duì)象實(shí)例來(lái)保存cookie,之后寫入文件cookie=cookielib.MozillaCookieJar(filename)opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))postdata=urllib.urlencode({'stuid':'201200131012','pwd':'23342321'})#登錄教務(wù)系統(tǒng)的URLloginUrl='http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login'#模擬登錄,并把cookie保存到變量result=opener.open(loginUrl,postdata)#保存cookie到cookie.txt中cookie.save(ignore_discard=True,ignore_expires=True)#利用cookie請(qǐng)求訪問(wèn)另一個(gè)網(wǎng)址,此網(wǎng)址是成績(jī)查詢網(wǎng)址gradeUrl='http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bkscjcx.curscopre'#請(qǐng)求訪問(wèn)成績(jī)查詢網(wǎng)址result=opener.open(gradeUrl)printresult.read()

以上程序的原理如下

創(chuàng)建一個(gè)帶有cookie的opener,在訪問(wèn)登錄的URL時(shí),將登錄后的cookie保存下來(lái),然后利用這個(gè)cookie來(lái)訪問(wèn)其他網(wǎng)址。

如登錄之后才能查看的成績(jī)查詢呀,本學(xué)期課表呀等等網(wǎng)址,模擬登錄就這么實(shí)現(xiàn)啦,是不是很酷炫?

1.了解正則表達(dá)式

正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來(lái)表達(dá)對(duì)字符串的一種過(guò)濾邏輯。

正則表達(dá)式是用來(lái)匹配字符串非常強(qiáng)大的工具,在其他編程語(yǔ)言中同樣有正則表達(dá)式的概念,Python同樣不例外,利用了正則表達(dá)式,我們想要從返回的頁(yè)面內(nèi)容提取出我們想要的內(nèi)容就易如反掌了。

正則表達(dá)式的大致匹配過(guò)程是:1.依次拿出表達(dá)式和文本中的字符比較,2.如果每一個(gè)字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。3.如果表達(dá)式中有量詞或邊界,這個(gè)過(guò)程會(huì)稍微有一些不同。

2.正則表達(dá)式的語(yǔ)法規(guī)則

下面是Python中正則表達(dá)式的一些匹配規(guī)則,圖片資料來(lái)自CSDN

20130515113723855

3.正則表達(dá)式相關(guān)注解

(1)數(shù)量詞的貪婪模式與非貪婪模式

正則表達(dá)式通常用于在文本中查找匹配的字符串。Python里數(shù)量詞默認(rèn)是貪婪的(在少數(shù)語(yǔ)言里也可能是默認(rèn)非貪婪),總是嘗試匹配盡可能多的字 符;非貪婪的則相反,總是嘗試匹配盡可能少的字符。例如:正則表達(dá)式”ab*”如果用于查找”abbbc”,將找到”abbb”。而如果使用非貪婪的數(shù)量 詞”ab*?”,將找到”a”。

注:我們一般使用非貪婪模式來(lái)提取。

(2)反斜杠問(wèn)題

與大多數(shù)編程語(yǔ)言相 同,正則表達(dá)式里使用”/”作為轉(zhuǎn)義字符,這就可能造成反斜杠困擾。假如你需要匹配文本中的字符”/”,那么使用編程語(yǔ)言表示的正則表達(dá)式里將需要4個(gè)反 斜杠”////”:前兩個(gè)和后兩個(gè)分別用于在編程語(yǔ)言里轉(zhuǎn)義成反斜杠,轉(zhuǎn)換成兩個(gè)反斜杠后再在正則表達(dá)式里轉(zhuǎn)義成一個(gè)反斜杠。

Python里的原生字符串很好地解決了這個(gè)問(wèn)題,這個(gè)例子中的正則表達(dá)式可以使用r”//”表示。同樣,匹配一個(gè)數(shù)字的”//d”可以寫成r”/d”。有了原生字符串,媽媽也不用擔(dān)心是不是漏寫了反斜杠,寫出來(lái)的表達(dá)式也更直觀勒。

4.Python Re模塊

Python 自帶了re模塊,它提供了對(duì)正則表達(dá)式的支持。主要用到的方法列舉如下

Python
12345678910#返回pattern對(duì)象re.compile(string[,flag])  #以下為匹配所用函數(shù)re.match(pattern, string[, flags])re.search(pattern, string[, flags])re.split(pattern, string[, maxsplit])re.findall(pattern, string[, flags])re.finditer(pattern, string[, flags])re.sub(pattern, repl, string[, count])re.subn(pattern, repl, string[, count])

在介紹這幾個(gè)方法之前,我們先來(lái)介紹一下pattern的概念,pattern可以理解為一個(gè)匹配模式,那么我們?cè)趺传@得這個(gè)匹配模式呢?很簡(jiǎn)單,我們需要利用re.compile方法就可以。例如

Python
1pattern=re.compile(r'hello')

在參數(shù)中我們傳入了原生字符串對(duì)象,通過(guò)compile方法編譯生成一個(gè)pattern對(duì)象,然后我們利用這個(gè)對(duì)象來(lái)進(jìn)行進(jìn)一步的匹配。

另外大家可能注意到了另一個(gè)參數(shù) flags,在這里解釋一下這個(gè)參數(shù)的含義:

參數(shù)flag是匹配模式,取值可以使用按位或運(yùn)算符’|’表示同時(shí)生效,比如re.I | re.M。

可選值有:

Python
123456 ? re.I(全拼:IGNORECASE): 忽略大小寫(括號(hào)內(nèi)是完整寫法,下同) ? re.M(全拼:MULTILINE): 多行模式,改變'^'和'$'的行為(參見上圖) ? re.S(全拼:DOTALL): 點(diǎn)任意匹配模式,改變'.'的行為 ? re.L(全拼:LOCALE): 使預(yù)定字符類 /w /W /b /B /s /S 取決于當(dāng)前區(qū)域設(shè)定 ? re.U(全拼:UNICODE): 使預(yù)定字符類 /w /W /b /B /s /S /d /D 取決于unicode定義的字符屬性 ? re.X(全拼:VERBOSE): 詳細(xì)模式。這個(gè)模式下正則表達(dá)式可以是多行,忽略空白字符,并可以加入注釋。

在剛才所說(shuō)的另外幾個(gè)方法例如 re.match 里我們就需要用到這個(gè)pattern了,下面我們一一介紹。

注:以下七個(gè)方法中的flags同樣是代表匹配模式的意思,如果在pattern生成時(shí)已經(jīng)指明了flags,那么在下面的方法中就不需要傳入這個(gè)參數(shù)了。

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

這個(gè)方法將會(huì)從string(我們要匹配的字符串)的開頭開始,嘗試匹配pattern,一直向后匹配,如果遇到無(wú)法匹配的字符,立即返回 None,如果匹配未結(jié)束已經(jīng)到達(dá)string的末尾,也會(huì)返回None。兩個(gè)結(jié)果均表示匹配失敗,否則匹配pattern成功,同時(shí)匹配終止,不再對(duì) string向后匹配。下面我們通過(guò)一個(gè)例子理解一下

Python
123456789101112131415161718192021222324252627282930313233343536373839404142__author__='CQC'# -*- coding: utf-8 -*- #導(dǎo)入re模塊importre # 將正則表達(dá)式編譯成Pattern對(duì)象,注意hello前面的r的意思是“原生字符串”pattern=re.compile(r'hello') # 使用re.match匹配文本,獲得匹配結(jié)果,無(wú)法匹配時(shí)將返回Noneresult1=re.match(pattern,'hello')result2=re.match(pattern,'helloo CQC!')result3=re.match(pattern,'helo CQC!')result4=re.match(pattern,'hello CQC!') #如果1匹配成功ifresult1:    # 使用Match獲得分組信息    printresult1.group()else:    print'1匹配失敗!' #如果2匹配成功ifresult2:    # 使用Match獲得分組信息    printresult2.group()else:    print'2匹配失敗!' #如果3匹配成功ifresult3:    # 使用Match獲得分組信息    printresult3.group()else:    print'3匹配失敗!' #如果4匹配成功ifresult4:    # 使用Match獲得分組信息    printresult4.group()else:    print'4匹配失敗!'

運(yùn)行結(jié)果

Python
1234hellohello3匹配失敗!hello

匹配分析

1.第一個(gè)匹配,pattern正則表達(dá)式為’hello’,我們匹配的目標(biāo)字符串string也為hello,從頭至尾完全匹配,匹配成功。

2.第二個(gè)匹配,string為helloo CQC,從string頭開始匹配pattern完全可以匹配,pattern匹配結(jié)束,同時(shí)匹配終止,后面的o CQC不再匹配,返回匹配成功的信息。

3.第三個(gè)匹配,string為helo CQC,從string頭開始匹配pattern,發(fā)現(xiàn)到 ‘o’ 時(shí)無(wú)法完成匹配,匹配終止,返回None

4.第四個(gè)匹配,同第二個(gè)匹配原理,即使遇到了空格符也不會(huì)受影響。

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

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

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

下面我們用一個(gè)例子來(lái)體會(huì)一下

Python
123456789101112131415161718192021222324252627282930313233343536# -*- coding: utf-8 -*-#一個(gè)簡(jiǎn)單的match實(shí)例 importre# 匹配如下內(nèi)容:?jiǎn)卧~+空格+單詞+任意字符m=re.match(r'(/w+) (/w+)(?P.*)','hello world!') print"m.string:",m.stringprint"m.re:",m.reprint"m.pos:",m.posprint"m.endpos:",m.endposprint"m.lastindex:",m.lastindexprint"m.lastgroup:",m.lastgroupprint"m.group():",m.group()print"m.group(1,2):",m.group(1,2)print"m.groups():",m.groups()print"m.groupdict():",m.groupdict()print"m.start(2):",m.start(2)print"m.end(2):",m.end(2)print"m.span(2):",m.span(2)printr"m.expand(r'/g /g/g'):",m.expand(r'/2 /1/3') ### output #### m.string: hello world!# m.re: # m.pos: 0# m.endpos: 12# m.lastindex: 3# m.lastgroup: sign# m.group(1,2): ('hello', 'world')# m.groups(): ('hello', 'world', '!')# m.groupdict(): {'sign': '!'}# m.start(2): 6# m.end(2): 11# m.span(2): (6, 11)# m.expand(r'/2 /1/3'): world hello!

(2)re.search(pattern, string[, flags])

search方法與match方法極其類似,區(qū)別在于match()函數(shù)只檢測(cè)re是不是在string的開始位置匹配,search()會(huì)掃描整個(gè)string查找匹配,match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回None。同樣,search方法的返回對(duì)象同樣match()返回對(duì)象的方法和屬性。我們用一個(gè)例子感受一下

Python
12345678910111213#導(dǎo)入re模塊import re # 將正則表達(dá)式編譯成Pattern對(duì)象pattern = re.compile(r'world')# 使用search()查找匹配的子串,不存在能匹配的子串時(shí)將返回None# 這個(gè)例子中使用match()無(wú)法成功匹配match = re.search(pattern,'hello world!')if match:    # 使用Match獲得分組信息    print match.group()### 輸出 #### world

(3)re.split(pattern, string[, maxsplit])

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

Python
1234567importre pattern=re.compile(r'/d+')printre.split(pattern,'one1two2three3four4') ### 輸出 #### ['one', 'two', 'three', 'four', '']

(4)re.findall(pattern, string[, flags])

搜索string,以列表形式返回全部能匹配的子串。我們通過(guò)這個(gè)例子來(lái)感受一下

Python
1234567import re pattern = re.compile(r'/d+')print re.findall(pattern,'one1two2three3four4') ### 輸出 #### ['1', '2', '3', '4']

(5)re.finditer(pattern, string[, flags])

搜索string,返回一個(gè)順序訪問(wèn)每一個(gè)匹配結(jié)果(Match對(duì)象)的迭代器。我們通過(guò)下面的例子來(lái)感受一下

Python
12345678importre pattern=re.compile(r'/d+')forminre.finditer(pattern,'one1two2three3four4'):    printm.group(), ### 輸出 #### 1 2 3 4

(6)re.sub(pattern, repl, string[, count])

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

Python
123456789101112131415import re pattern = re.compile(r'(/w+) (/w+)')s = 'i say, hello world!' print re.sub(pattern,r'/2 /1', s) def func(m):    return m.group(1).title() + ' ' + m.group(2).title() print re.sub(pattern,func, s) ### output #### say i, world hello!# I Say, Hello World!

(7)re.subn(pattern, repl, string[, count])

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

Python
123456789101112131415importre pattern=re.compile(r'(/w+) (/w+)')s='i say, hello world!' printre.subn(pattern,r'/2 /1',s) deffunc(m):    returnm.group(1).title()+' '+m.group(2).title() printre.subn(pattern,func,s) ### output #### ('say i, world hello!', 2)# ('I Say, Hello World!', 2)

5.Python Re模塊的另一種使用方式

在上面我們介紹了7個(gè)工具方法,例如match,search等等,不過(guò)調(diào)用方式都是 re.match,re.search的方式,其實(shí)還有另外一種調(diào)用方式,可以通過(guò)pattern.match,pattern.search調(diào)用,這樣 調(diào)用便不用將pattern作為第一個(gè)參數(shù)傳入了,大家想怎樣調(diào)用皆可。

函數(shù)API列表

Python
1234567match(string[,pos[,endpos]])|re.match(pattern,string[,flags])search(string[,pos[,endpos]])|re.search(pattern,string[,flags])split(string[,maxsplit])|re.split(pattern,string[,maxsplit])findall(string[,pos[,endpos]])|re.findall(pattern,string[,flags])finditer(string[,pos[,endpos]])|re.finditer(pattern,string[,flags])sub(repl,string[,count])|re.sub(pattern,repl,string[,count])subn(repl,string[,count])|re.sub(pattern,repl,string[,count])


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴宁市| 兴安盟| 汶川县| 临夏县| 达拉特旗| 肇东市| 渭源县| 庆元县| 吉安市| 镇江市| 普安县| 绥德县| 简阳市| 孟津县| 扶绥县| 长泰县| 西乌珠穆沁旗| 施甸县| 奉化市| 枣强县| 武隆县| 滨州市| 镇沅| 玉山县| 临澧县| 凭祥市| 西昌市| 津南区| 新乐市| 金秀| 新乐市| 孝感市| 清流县| 铁岭县| 土默特右旗| 铅山县| 达孜县| 繁峙县| 大冶市| 师宗县| 克什克腾旗|