日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

正則表達式是一個很強大的字符串處理工具,幾乎任何關于字符串的操作都可以使用正則表達式來完成,作為一個爬蟲工作者,每天和字符串打交道,正則表達式更是不可或缺的技能。

正則表達式在不同的語言中使用方式不盡相同,不過只要學會了任意一門語言的正則表達式用法,其他語言中大部分也只是換了個函數的名稱而已,本質都是一樣的。

注:本文摘自 i 春秋社區(bbs.ichunqiu.com),歡迎更多優秀作者去社區投稿,幫助更多萌新們快速掌握新技能。文章閱讀用時約10分鐘。

「黑客必備技能」Python正則表達式詳解

 

原子

原子是正則表達式中最基本的單位,每個正則表達式中至少要包含一個原子。常見的原子類型:

  • 普通字符作為原子
  • 非打印字符作為原子
  • 通用字符作為原子
  • 原子表

普通字符作為原子

演示代碼:

import re#引用re
string = "shentouyun"#定義整段,普通字符作為原子
pat = "yun"#提取yun
ret = re.search(pat,string)#第一個參數為提取,第二個為整個字段
print(ret)#輸出

輸出

<_sre.SRE_Match object; span=(7, 10), match='yun'>

非打印字符作為原子

什么是非打印字符,如n,t(換行,制表),代表一些操作的字符也可以作為原子

操作代碼與小知識

string1 = '''shentouyun
nuibi
'''
pat1 = 'n'
ret=re.search(pat1,string1)
print(ret)

運行后

<_sre.SRE_Match object; span=(10, 11), match='n'>

小知識

#在這里解釋一個基礎,我沒有提到過
string = '''
shentouyun
nuibi
'''
print(string)
#這段代碼里,其特點為string被三引號包裹,并在代碼里實現換行其運行結果
shentouyun
nuibi
#實現了一個n的操作其代碼等同于
string ="shentouyunnnuibi"
print(string)

 

通用字符作為原子

什么是通用字符?

1. w匹配任意一個字母數字或下劃線;

2. W匹配除去字母數字或下劃線任意一個字符;

3. d匹配十進制數;

4. D除十進制以外的任意一個字符;

5. s匹配一個空白字符;

6. S除去空白字符。

簡單的例子

string1 = "shentouyun3215454biji"
pat1 = 'dddd'#匹配四個十進制數
ret=re.search(pat1,string1)
print(ret)

運行后

<_sre.SRE_Match object; span=(10, 14), match='3215'>

也可以混合使用

string1 = "shentouyun3215454biji"
pat1 = 'wdddd'#匹配一個字母+匹配四個十進制數
ret=re.search(pat1,string1)
print(ret)

運行后

<_sre.SRE_Match object; span=(9, 14), match='n3215'>

沒有符合格式的,如空白就不會匹配出來,這里不過多的描述,占用空間。

原子表

[ots]任意的提取一個原子出來,直接任意選擇一個原子表原子,如下:

string1 = "shentouyun3215454biji"
pat1 = "shen[otoasdjojds]ou"
ret=re.search(pat1,string1)
print(ret)

運行后

<_sre.SRE_Match object; span=(0, 7), match='shentou'>

只從原子表中選擇一個原子,其原子表內原子地位平等。

非原子表

符號^ 英文狀態下的shift+6

字符串里出現了非原子表,返回None,其代碼如下:

string1 = "shentouyun3215454biji"
pat1 = "shen[^tun]ou"
#shen后面應該是匹配t結果原子表里出了[tun]三個原子外其他的原子都可以匹配
#顯然本代碼中的原子是無法匹配的
ret=re.search(pat1,string1)
print(ret)

返回如下:

None

如果正常運行非原子表外的字符如string1字符串中截取的shen后面是t,在非原子表上,沒有出現t,則返回shent。

string1 = "shentouyun3215454biji"
pat1 = "shen[^asd]"
#為了更加直白我把ou兩個字符去掉了
ret=re.search(pat1,string1)
print(ret)

運行后

<_sre.SRE_Match object; span=(0, 5), match='shent'>

元字符

特殊含義的字符

所謂的元字符,就是正則表達式中具有一些特殊含義的字符,比如重復N多次前面的字符。

「黑客必備技能」Python正則表達式詳解

 

 

"."除換行外任意一個字符

代碼如下:

string1 = "shentouyun3215454biji"
pat1 = "shen.ou"#這里.匹配除了換行符外的任意字符
ret=re.search(pat1,string1)
print(ret)

運行結果

<_sre.SRE_Match object; span=(0, 7), match='shentou'>

當然你也可以多匹配些,比如多些點點。

string1 = "shentouyun3215454biji"
pat1 = "shen......"
ret=re.search(pat1,string1)
print(ret)

運行后

<_sre.SRE_Match object; span=(0, 10), match='shentouyun'>

開始位置^與結束位置$

string1 = "shentouyun3215454biji"
pat1 = "^s..."
ret=re.search(pat1,string1)
print(ret)
運行后
<_sre.SRE_Match object; span=(0, 4), match='shen'>

因為s是開始,也就是“排頭”結束位置也同理。

string1 = "shentouyun3215454biji"
pat1 = "b...$"
ret=re.search(pat1,string1)
print(ret)
運行后
<_sre.SRE_Match object; span=(17, 21), match='biji'>

*""0次1次多次**

string1 = "shentouyun3215454biji"
pat1 = "shen.*"
ret=re.search(pat1,string1)
print(ret)
運行后
<_sre.SRE_Match object; span=(0, 21), match='shentouyun3215454biji'>

為什么會全匹配,看*號的定義為多次,咱們的"."表示除了換行外全匹配,兩者一配合。

+號與?號

+匹配多次,正常顯示無法匹配0次,演示錯誤例子。

string1 = "shentouyun3215454biji"
pat1 = "a+"
ret=re.search(pat1,string1)
print(ret)
None

演示正確例子

string1 = "aaaaaaaaaaaa"
pat1 = "a+"
ret=re.search(pat1,string1)
print(ret)
<_sre.SRE_Match object; span=(0, 12), match='aaaaaaaaaaaa'>

問號就更好弄了

問號直接演示錯誤例子,無法顯示多次

string1 = "aaaafsedfsfdffasafadaaaaaaaa"
pat1 = "a?"
ret=re.search(pat1,string1)
print(ret)
<_sre.SRE_Match object; span=(0, 1), match='a'>

{n}與{n,}

string1 = "aaaa"
pat1 = "a{4}"
ret=re.search(pat1,string1)
print(ret)
<_sre.SRE_Match object; span=(0, 4), match='aaaa'>

如果換成3呢

<_sre.SRE_Match object; span=(0, 3), match='aaa'>

打印了三次,成功演示了什么叫做至少,當然你多了不行,改成5試試。

None

{n,m}至少多少次,至多多少次

string1 = "aaaa"
pat1 = "a{3,5}"
ret=re.search(pat1,string1)
print(ret)
<_sre.SRE_Match object; span=(0, 4), match='aaaa'>

模式修正符

所謂的模式修正符,即可以在不改變正則表達式的情況下,通過模式修正符改變正則表達式的含義,從而實現一些匹配結果的調整等功能。

模式修正符有什么?

I忽略大小寫

M多行匹配

L本地化識別匹配

U unicode編碼

S讓匹配包括換行符

錯誤代碼演示

string = "ShenTouYun"
pat="shen"
ret = re.search(pat,string)
print(ret)

返回None,因為默認有大小寫限制,引用一下I就可以了。

string = "ShenTouYun"
pat="shen"
ret = re.search(pat,string,re.I)
print(ret)

運行結果

<_sre.SRE_Match object; span=(0, 4), match='Shen'>

 

貪婪模式與懶惰模式

貪婪模式的核心點就是盡可能多的匹配

懶惰模式的核心就是盡可能少的匹配

貪婪模式

string = "SheSnTouYunYS"
pat="s.*S"
ret = re.search(pat,string,re.I)
print(ret)

運行結果

<_sre.SRE_Match object; span=(0, 13), match='SheSnTouYunYS'>

貪婪模式與懶惰模式有什么用呢?

看對比

string = "SheSnTouYunYS"
pat="s.*S"#貪婪模式找到最后一個s
pat1="s.*?S"#懶惰模式,特征為?,找到第一個s就不往下找了
ret = re.search(pat,string,re.I)
ret1 = re.search(pat1,string,re.I)
print(ret)
print(ret1)

運行結果

<_sre.SRE_Match object; span=(0, 13), match='SheSnTouYunYS'>
<_sre.SRE_Match object; span=(0, 4), match='SheS'>

 

正則表達式函數

1、re.match( )函數從頭開始匹配

2、re.search( )函數從任何地方開始匹配

3、全局匹配函數

match函數演示

string1 = "a**fewfaaa"
pat1 = "a"
ret=re.match(pat1,string1)
print(ret)
運行結果可匹配
<_sre.SRE_Match object; span=(0, 1), match='a'>

不是第一個開始匹配

string1 = "a**fewfaaa"
pat1 = "d"
ret=re.match(pat1,string1)
print(ret)
運行結果不可匹配
None

 

全局匹配函數

全局匹配格式

re.compile(正則表達式).findall(數據)
string1 = "a**fewfaaa"
pat1 = "d.*?a"
ret=re.compile(pat1).findall(string1)
print(ret)
結果
['da']

在碼文中的一些雜亂代碼

import re#引用re
'''
string = "shentouyun"#定義整段,普通字符作為原子
pat = "yun"#提取yun
ret = re.search(pat,string)#第一個參數為提取,第二個為整個字段
print(ret)#輸出
match
sub
search
全局匹配
string = "SheSnTouYunYS"
pat="s.*S"#貪婪模式找到最后一個s
pat1="s.*?S"#懶惰模式,特征為?,找到一個y就不往下找了
ret = re.search(pat,string,re.I)
ret1 = re.search(pat1,string,re.I)
print(ret)
print(ret1)
'''

首先預熱下,爬取豆瓣首頁

導入urllib庫下的request

import urllib.request

使用下urlopen打開網站返回html

urllib.request.urlopen("https://www.douban.com/")

讀一下看看拿到了什么東西,使用read( ),并給douban保存方便再GUI里調用

douban = urllib.request.urlopen("https://www.douban.com/").read()

可以獨立嘗試,會非常卡。簡單點是用len看字節

>>> len(douban)
105653

 

爬取豆瓣評論

導入正則模塊(re)

import re

寫了個例子

#豆瓣評論爬取小例子
import urllib.request
import re
douban = urllib.request.urlopen("https://movie.douban.com/subject/27199913/?from=showing").read().decode("UTF-8")
pat = '<span class="short">.*?</span>'
rst = re.compile(pat).findall(douban)
print(rst[0])

引用decode("UTF-8")對其解碼為utf-8

正則為

<span class="short">(.*?)</span>

如何寫正則與本例的細節

打開網站

https://movie.douban.com/subject/27199913/?from=showing

右鍵源代碼

發現評論格式為

<span class="short">就是山西版本的《兩桿大煙槍》或者說《瘋狂的石頭》,將山西風光和特色與影片融合的很好,雖然還是有所瑕疵,也難逃一些俗套爛大街的劇情和段子,但是還可以。</span>

所有評論被標簽包裹,可以進行抓取,使用懶惰模式進行操作。

<span class="short">.*?</span>

"."全匹配,其細節為標簽里有雙引號,我們再寫正則時使用單引號括起來,不要再使用雙引號了。

寫循環把東西都顯示出來

for i in range(0,len(rst)):
 print(rst[i])

運行為

>>> ================================ RESTART ================================
>>>
['一直很喜歡這種結構的電影,一圈圈地放出線團,再一段段收回,圓融又宿命。以山西籍為主的演員都挺走心的,生活的雞飛狗走很是活靈活現,而且駱達華的出場太驚喜。導演說是改編太貴,索性自己寫。但要是看過《提著心吊著膽》,會發現許多元素重合度很高,比如生意慘淡的飯店、存在問題的夫婦、警察、笨賊、拜金女、裝大款……就連意外之財也是丟在飯店里。電影結尾顧慮較多,但整體完成度與幽默感不差。@平遙,特意買票支持,卻來...', '算是一部跟期待打平的作品吧,中規中矩,沒有驚艷,王大治倒是真有那么幾分長相之外的亮點。故事一圈圈閃回,重復的部分有點多,生怕觀眾跟不上這個倒敘+插敘的節奏似的。四川話河南話陜西話山西話一鍋燴,泱泱大中華式的熱鬧。想要揭示人心叵測,但終歸是淺了一點?!酒竭b電影節2018.10.19', '這種結構挺好', '審美疲勞,這種太多了,都大同小異。從每組人物的角度,反復講同一個事。國產電影里的歹徒劫匪都是來搞笑的,都是**,呵呵。', '巧就巧在結構上。']
一直很喜歡這種結構的電影,一圈圈地放出線團,再一段段收回,圓融又宿命。以山西籍為主的演員都挺走心的,生活的雞飛狗走很是活靈活現,而且駱達華的出場太驚喜。導演說是改編太貴,索性自己寫。但要是看過《提著心吊著膽》,會發現許多元素重合度很高,比如生意慘淡的飯店、存在問題的夫婦、警察、笨賊、拜金女、裝大款……就連意外之財也是丟在飯店里。電影結尾顧慮較多,但整體完成度與幽默感不差。@平遙,特意買票支持,卻來...
算是一部跟期待打平的作品吧,中規中矩,沒有驚艷,王大治倒是真有那么幾分長相之外的亮點。故事一圈圈閃回,重復的部分有點多,生怕觀眾跟不上這個倒敘+插敘的節奏似的。四川話河南話陜西話山西話一鍋燴,泱泱大中華式的熱鬧。想要揭示人心叵測,但終歸是淺了一點?!酒竭b電影節2018.10.19
這種結構挺好
審美疲勞,這種太多了,都大同小異。從每組人物的角度,反復講同一個事。國產電影里的歹徒劫匪都是來搞笑的,都是**,呵呵。
巧就巧在結構上。
>>>

保存到本地

fh = open("G:\Python\doubanpinglun.txt","w")#打開文件并新建doubanpinglun.txt

open里的路徑為本地路徑

完整代碼如下:

#豆瓣評論爬取小例子
import urllib.request
import re
douban = urllib.request.urlopen("https://movie.douban.com/subject/27199913/?from=showing").read().decode("UTF-8")
pat = '<span class="short">(.*?)</span>'
rst = re.compile(pat).findall(douban)
print(rst)
fh = open("G:\python\doubanpinglun.txt","w")#打開文件并新建doubanpinglun.txt
for i in range(0,len(rst)):
 print(rst[i])
 fh.write(rst[i]+"n")#寫入文件
fh.close()#關閉文件

以上就是今天分享的內容,大家學會了嗎?

分享到:
標簽:正則表達式 Python
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定