正则系列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就说到这里。

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