re.search
re.search掃描整個字符串並返回第一個成功的匹配。
該方法有3個參數,第一個就是你寫的正則表達式,第二個匹配的目標字符串,第三個是一個匹配模式
re.search(pattern, string, flags=0)
- 先看一個re.match例子,之後我們對比search。
#我們需要拿到Hello 1234567 World_This is a Regex Demo 這一部分
import re
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
result = re.match('Hello.*?(\d+).*?Demo',content)
print(result)
結果:
None
我們發現用match的輸出結果是None,也就是說pattern最開頭和content字符串最開頭是不匹配的。那麼整個的匹配就會失敗。
- 接下來看re.search,代碼不變,只是re.match變成re.search,來看下結果
import re
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
result = re.search('Hello.*?(\d+).*?Demo',content)
print(result)
print(result.group(1))
結果:
<_sre.SRE_Match object; span=(13, 53), match=‘Hello 1234567 World_This is a Regex Demo’>
1234567
也就是說pattern搜索的時候,是從字符串Extra開始的,用match的話,正則表達式從Hello開始是不行的,但用re.search就會搜索,不會管開頭一致不一致。
總結:爲匹配方便,能用search就不用match,match方法限定匹配時,頭部必須是一致的
- 匹配演練:最後我們做些匹配演練,實戰下
import re
html='''<div id="songs-list">
<h2 class="title">經典老歌</h2>
<p class="introduction">
經典老歌列表
</p>
<ul id ="list" class="list-group">
<li data-view="2">一路上有你</li>
<li data-view="7">
<a href="/2.mp3" singer="任賢齊">滄海一聲笑</a>
</li>
<li data-view="4" class="active">
<a href="/3.mp3" singer="齊秦">往事隨風</a>
</li>
<li data-view="6"><a href="/4.mp3" singer="beyond">光輝歲月</a></li>
<li data-view="5"><a href="/5.mp3" singer="陳惠琳">記事本</a></li>
<li data-view="5">
<a href="/6.mp3" singer="鄧麗君"><i class="fa fa-user"></i>但願人長久</a>
</li>
</ul>
</div>
'''
上面是html代碼,要求匹配出 第3個li標籤中的齊秦 往事隨風 ,代碼如下:
result = re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>',html,re.S)#re.S確保.能匹配到換行符
if result:
print(result.group(1),result.group(2))
結果:
齊秦 往事隨風
我們還要求匹配出第二個li標籤中的內容 任賢齊 滄海一聲笑
result = re.search('<li.*?singer="(.*?)">(.*?)</a>',html,re.S)
if result:
print(result.group(1),result.group(2))
結果:
任賢齊 滄海一聲笑
如果匹配時候不需要匹配換行符,那麼參數中就沒必要帶re.S,比如匹配第4個和第5個li標籤中的歌手和歌名。但是re.search也僅僅是返回一個符合匹配的結果。如果我們要返回符合匹配的所有結果,要用到re.findall。這一節的re.search就說到這裏。