python中的正则表达式是干嘛的_操作python中的正则表达式(上)
上次的爬蟲最終獲取了馬蜂窩旅行評論頁面的全部內容,其實很多都是無用信息,我們要進行篩選清洗,這就用到了正則表達式,在寫爬蟲后續之前先大概搞一下正則……
先上代碼吧,今天先搞一小部分:
import re
print(re.match('you','you are my sunshine'))
print(re.match('you','you are my sunshine').span())
print(re.match('my','you are my sunshine'))
print(re.search('you','you are my sunshine').span())
print(re.search('my','you are my sunshine').span())
love='you are my sunshine'
pat=re.match(r'(.*) are (.*?) .*',love)
if pat:
print('獲取的全部字符序列為:'+str(pat.group()))
print('獲取的第一個分組為:'+str(pat.group(1)))
print('獲取的第二個分組為:'+str(pat.group(2)))
print('獲取的全部分組為:'+str(pat.groups()))
else:
print('沒有匹配內容!')
rep=re.sub(r'sun.*$','life',love)
print('字符串更新為:'+str(rep))
首先導入模塊re,該模塊包含所有的正則實現的功能,很好用~~
接下里五大行測試一下兩個方法match()和search(),前者只匹配字符串的開頭,而后者匹配整個字符串,也就是說如果你給出的正則表達式在一開始就不滿足字符串那match就直接返回none,但search則會搜尋整個字符串,知道找到匹配內容;span()方法返回匹配字符串的區間,左閉右開,如(2,5)表示所匹配的字符串中的字符在原字符串中的下標為2,3,4。
看一下結果:
第一條為match函數返回的信息,包括匹配區間、匹配字符等;第三條為None,也證實了兩個方法的區別。
接下來用到了正規的正則表達式,(.*)為一個分組,也是我們所需的內容,'.'可以匹配除換行符之外的所有字符,‘*’可以匹配0至無限長度的字符;后面沒有()的.*表示的是匹配后面的所有字符,這一部分我們不關心是什么;還有一個就是‘?’,她使得我們去盡量少的字符,這一塊后邊可以演示一下。
group()方法返回我們所獲取的所有字符串,它是以元組的形式返回的,所有和字符串連接需要轉化一下,()中的1和2表示我們需要的第一個和第二個分組,也就是正則表達式中的()內容,groups返回所有分組,這個區別一下group,看結果:
很清晰吧。。注意一下第一條和第四條。。
最后是sub()函數,它的功能是用某一確定字符串替換匹配內容,該例中我們匹配的是以sun開頭的字符串,‘$’的意思是以前面的字符結尾,在這里就表示sun后面的所有字符,然后把該部分用life替換掉,結果為:
由于sunshine是最后一個單詞,所以不是那么明顯,我們將‘sun’改為‘my’,看下結果:
沒毛病。。匹配了my后面的所有字符。。
還有一點就是前面說的正則中的‘?’,我們將上面的正則表達式改一下:pat=re.match(r'(.*) are (.*?)',love),看一下結果:
再改一下:pat=re.match(r'(.*) are (.*)',love),看下結果:
是不是發現點什么,前者匹配為空,后者匹配了are后面的所有內容,這一點也是之前爬蟲時數據紊亂的原因所在,找個時間好好聊聊這一塊~~~我現在在想前者匹配的是不是一個空格啊,或者真的就是空,盡量少嘛。。
總結
以上是生活随笔為你收集整理的python中的正则表达式是干嘛的_操作python中的正则表达式(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android mysql sqlite
- 下一篇: python枪战项目计划书_人肉(共享)