• 生活就是这样,需要去灌溉!
    • 谢谢您的关注,欢迎您的注册与写作!
    • 循环往复,生生不息,或许这就是生命的意义吧!生命是插曲的产品吧!
    • 古今多少事,都付笑言中!
    • 风住尘香花已尽,日晚倦梳头。物是人非事事休,欲语泪先流。
    • 闻说双溪春尚好,也拟泛轻舟,只恐双溪舴艋舟,载不动许多愁。

Python3中正则表达式使用方法

Linux 柳叶扉鸿 7年前 (2018-05-21) 7644次浏览 已收录 扫描二维码
内容目录

search()
我们在前面提到过 match()方法是从字符串的开头开始匹配,一旦开头不匹配,那么整个匹配就失败了。

我们看下面的例子:

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

None

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

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

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

Python3中正则表达式使用方法
这样就得到了匹配结果。

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

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

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

Python3中正则表达式使用方法
观察到

节点里面有许多

首先我们尝试提取 class 为 active 的

节点内部的超链接包含的歌手名和歌名。

所以我们需要提取第三个

节点下的

节点的 singer 属性和文本。

所以正则表达式可以以

开头,然后接下来寻找一个标志符 active,中间的部分可以用.*?来匹配,然后接下来我们要提取 singer 这个属性值,所以还需要写入 singer=”(.*?)”,我们需要提取的部分用小括号括起来,以便于用 group()方法提取出来,它的两侧边界是双引号,然后接下来还需要匹配

节点的文本,那么它的左边界是>,右边界是,所以我们指定一下左右边界,然后目标内容依然用(.*?)来匹配,所以最后的正则表达式就变成了(.*?)’,然后我们再调用 search()方法,它便会搜索整个 HTML 文本,找到符合正则表达式的第一个内容返回。

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

所以整个匹配代码如下:

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

运行结果:

Python3中正则表达式使用方法
可以看到这个正是我们想提取的 class 为 active 的

节点内部的超链接包含的歌手名和歌名。

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

Python3中正则表达式使用方法

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

运行结果如下:

Python3中正则表达式使用方法
因为我们把 active 标签去掉之后,从字符串开头开始搜索,符合条件的节点就变成了第二个

节点,后面的就不再进行匹配,所以运行结果自然就变成了第二个

节点中的内容。

注意在上面两次匹配中,search()方法的第三个参数我们都加了 re.S,使得.*?可以匹配换行,所以含有换行的

节点被匹配到了,如果我们将其去掉,结果会是什么?

Python3中正则表达式使用方法

运行结果:

Python3中正则表达式使用方法
可以看到结果就变成了第四个

节点的内容,这是因为第二个和第三个

标签都包含了换行符,去掉 re.S 之后,.*?已经不能匹配换行符,所以正则表达式不会匹配到第二个和第三个

节点,而第四个

节点中不包含换行符,所以成功匹配。

由于绝大部分的 HTML 文本都包含了换行符,所以通过上面的例子,我们尽量都需要加上 re.S 修饰符,以免出现匹配不到的问题。


柳叶扉鸿 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Python3中正则表达式使用方法
相关文章
喜欢 (1)