正則系列2: re.search用法

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就說到這裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章