详解Python3中的正则表达式的基本用法(4)

在这里我们有一个字符串,它是以Extra开头的,但是正则表达式我们是以Hello开头的,整个正则表达式是字符串的一部分,但是这样匹配是失败的,也就是说只要第一个字符不匹配整个匹配就不能成功,运行结果如下:

None

所以match()方法在我们在使用的时候需要考虑到开头的内容,所以在做匹配的时候并不那么方便,它适合来检测某个字符串是否符合某个正则表达式的规则。

所以在这里就有另外一个方法search(),它在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果,也就是说,正则表达式可以是字符串的一部分,在匹配时,search()方法会依次扫描字符串,直到找到第一个符合规则的字符串,然后返回匹配内容,如果搜索完了还没有找到,那就返回None。

我们把上面的代码中的match()方法修改成search(),再看下运行结果:

<_sre.SRE_Match object; span=(13, 53), match='Hello 1234567 World_This is a Regex Demo'>

这样就得到了匹配结果。

所以说,为了匹配方便,我们可以尽量使用search()方法。

下面我们再用几个实例来感受一下search()方法的用法。

首先这里有一段待匹配的HTML文本,我们接下来写几个正则表达式实例来实现相应信息的提取。

html = '''<div> <h2>经典老歌</h2> <p> 经典老歌列表 </p> <ul> <li data-view="2">一路上有你</li> <li data-view="7"> <a href="https://www.jb51.net/2.mp3" singer="任贤齐">沧海一声笑</a> </li> <li data-view="4"> <a href="https://www.jb51.net/3.mp3" singer="齐秦">往事随风</a> </li> <li data-view="6"><a href="https://www.jb51.net/4.mp3" singer="beyond">光辉岁月</a></li> <li data-view="5"><a href="https://www.jb51.net/5.mp3" singer="陈慧琳">记事本</a></li> <li data-view="5"> <a href="https://www.jb51.net/6.mp3" singer="邓丽君"><i></i>但愿人长久</a> </li> </ul> </div>'''

观察到<ul>节点里面有许多<li>节点,其中<li>节点有的包含节点,有的不包含节点,节点还有一些相应的属性,超链接和歌手名。

首先我们尝试提取class为active的<li>节点内部的超链接包含的歌手名和歌名。

所以我们需要提取第三个<li>节点下的节点的singer属性和文本。

所以正则表达式可以以<li>开头,然后接下来寻找一个标志符active,中间的部分可以用.?来匹配,然后接下来我们要提取singer这个属性值,所以还需要写入singer="(.?)",我们需要提取的部分用小括号括起来,以便于用group()方法提取出来,它的两侧边界是双引号,然后接下来还需要匹配节点的文本,那么它的左边界是>,右边界是,所以我们指定一下左右边界,然后目标内容依然用(.?)来匹配,所以最后的正则表达式就变成了<li.?active.?singer="(.?)">(.*?)',然后我们再调用search()方法,它便会搜索整个HTML文本,找到符合正则表达式的第一个内容返回。

另外由于代码有换行,所以这里第三个参数需要传入re.S

所以整个匹配代码如下:

reresult = re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>', html, re.S) if result: print(result.group(1), result.group(2))

由于我们需要获取的歌手和歌名都已经用了小括号包围,所以可以用group()方法获取,序号依次对应group()的参数。

运行结果:

齐秦 往事随风

可以看到这个正是我们想提取的class为active的<li>节点内部的超链接包含的歌手名和歌名。

那么正则表达式不加active会怎样呢?也就是匹配不带class为active的节点内容,我们将正则表达式中的active去掉,代码改写如下:

reresult = re.search('<li.*?singer="(.*?)">(.*?)</a>', html, re.S) if result: print(result.group(1), result.group(2))

由于search()方法会返回第一个符合条件的匹配目标,那在这里结果就变了。

运行结果如下:

任贤齐 沧海一声笑

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjxjff.html