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

None
所以 match()方法在我们在使用的时候需要考虑到开头的内容,所以在做匹配的时候并不那么方便,它适合来检测某个字符串是否符合某个正则表达式的规则。
所以在这里就有另外一个方法 search(),它在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果,也就是说,正则表达式可以是字符串的一部分,在匹配时,search()方法会依次扫描字符串,直到找到第一个符合规则的字符串,然后返回匹配内容,如果搜索完了还没有找到,那就返回 None。
我们把上面的代码中的 match()方法修改成 search(),再看下运行结果:

所以说,为了匹配方便,我们可以尽量使用 search()方法。
下面我们再用几个实例来感受一下 search()方法的用法。
首先这里有一段待匹配的 HTML 文本,我们接下来写几个正则表达式实例来实现相应信息的提取。

节点里面有许多
- 节点,其中
- 节点有的包含节点,有的不包含节点,节点还有一些相应的属性,超链接和歌手名。
首先我们尝试提取 class 为 active 的
节点内部的超链接包含的歌手名和歌名。
所以我们需要提取第三个
节点下的
所以正则表达式可以以
开头,然后接下来寻找一个标志符 active,中间的部分可以用.*?来匹配,然后接下来我们要提取 singer 这个属性值,所以还需要写入 singer=”(.*?)”,我们需要提取的部分用小括号括起来,以便于用 group()方法提取出来,它的两侧边界是双引号,然后接下来还需要匹配
节点的文本,那么它的左边界是>,右边界是,所以我们指定一下左右边界,然后目标内容依然用(.*?)来匹配,所以最后的正则表达式就变成了(.*?)’,然后我们再调用 search()方法,它便会搜索整个 HTML 文本,找到符合正则表达式的第一个内容返回。
另外由于代码有换行,所以这里第三个参数需要传入 re.S
所以整个匹配代码如下:

运行结果:

节点内部的超链接包含的歌手名和歌名。
那么正则表达式不加 active 会怎样呢?也就是匹配不带 class 为 active 的节点内容,我们将正则表达式中的 active 去掉,代码改写如下:

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

节点,后面的就不再进行匹配,所以运行结果自然就变成了第二个
节点中的内容。
注意在上面两次匹配中,search()方法的第三个参数我们都加了 re.S,使得.*?可以匹配换行,所以含有换行的
节点被匹配到了,如果我们将其去掉,结果会是什么?

运行结果:

节点的内容,这是因为第二个和第三个
标签都包含了换行符,去掉 re.S 之后,.*?已经不能匹配换行符,所以正则表达式不会匹配到第二个和第三个
节点,而第四个
节点中不包含换行符,所以成功匹配。
由于绝大部分的 HTML 文本都包含了换行符,所以通过上面的例子,我们尽量都需要加上 re.S 修饰符,以免出现匹配不到的问题。
- 【Python】修改Windows中 pip 的缓存位置与删除 pip 缓存(1)
- 记录问题解决的连接(0)
- Python 格式化输出 —— 小数转化为百分数(0)
- 解决python中TypeError: not enough arguments for format string(0)
- ‘%s=%s’ % (k, v) for k, v in params.items(), ^ SyntaxError: Generator expression must be parent(0)
- 【Python】修改Windows中 pip 的缓存位置与删除 pip 缓存(1)
- 记录问题解决的连接(0)
- Python 格式化输出 —— 小数转化为百分数(0)
- 解决python中TypeError: not enough arguments for format string(0)
- ‘%s=%s’ % (k, v) for k, v in params.items(), ^ SyntaxError: Generator expression must be parent(0)