正则表达式 3|学习笔记

简介: 快速学习正则表达式 3

开发者学堂课程【高校精品课-华东师范大学 - Python 数据科学基础与实践正则表达式 3】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/1067/detail/15403


正则表达式 3

 

内容介绍:

一、re.search 方法

二、re.findall 方法

 

本课程主要包括 re.search 方法,re.findall 方法两个部分。

 

一、re.search 方法

1. 练习代码简介

必须是保持一致的那么接下用re.search方法来做一下这个匹配练习,那么这里有一段hm2代码,

然后里面</h2>,</p>是一个h2标签p标签。下面是一个经典老歌列表。

接下来是ul标签<ul ld=”list”class=”title-group“>

然后接下来一个又有好多li标签,<li data-view=”2”>一路有你</||>

,那么这里就是一些歌的列表,它的的内容就是有的有超链接,有的没有超链接,那么里面有些歌名,还有它的歌手信息,然后还有它的一个超链接等等之类的。

然后,接下来就用这整个一个字符串,做一下这个匹配练习,那么这整个字符串,其实也是比较常见的一种hm2代码样式,那么就用re.search方法,然后把里面的想要的一些数据提取出来。

2.练习匹配第一个li标签

首先是这个li的,带有class=”active”的齐秦往事随风这个地方,把它的歌手信息,还有它的歌名取出来,就用re.search,首先一个li表达式。那么直接写一个它的开头信息,比如说把它的Li标签首先指定一下。

然后接下来用.*?,然后把这个active这个地方写一个标志符,也是说接下来就要匹配到这个带有active的li标签,那么接下来再继续写.*?,那么可以匹配前面的一些A标签这个内容,然后接下来直接匹配到这singer,singer也就是说这里也是指定了一个标志符,然后等于引号,再把引号内容然后用小括号括起来”(.*?)”,然后再把往日随风这个地方用.*?,然后加一个小括号。

然后接下来就把字符串传过来,然后再把这个re.s传过来,那么可以看到里面是有一个换行符的,所以就需要加一个re.s,然后保证这个.可以匹配的任意的字符,把这个匹配结果打印。那么group(1)就是代表第一个小括号括起来的内容,group(2)的那就代表第二个小括号括起来的内容,

result=re.search(‘<li.*?active.*?singer=”(.*?)”>(.*?)</a>’,html,re.S)

If result:

Print(result.group(1), result.group(2))

匹配一下那就可以看到在这里就是正常的匹配出齐秦往事随风这么一个内容。那么也就是说,它会整个搜索这个字符串,然后找到能够匹配这个表达式的内容,然后再把要匹配的这个结果输出了。

3. 匹配第二个li标签

接下来再尝试匹配第二个li标签,那么第二个标签没有这个class=”active”,那么在这里就把这个active直接给它去掉,然后尝试匹配一下,看它会有什么结果,

result=re.search(‘<li.*? singer=”(.*?)”>(.*?)</a>’, html, re.S)

If result:

Print(result.group(1), result.group(2))

那么打印输入之后,可以看到它正常的匹配了第二个内容。沧海一声笑这个地方。也就是说它会直接进行搜索,然后搜索到第一个匹配的结果,然后就把输入出来,那么在这里,第一个匹配的结果就是第二个标签,这样就会有相应的结果了,

4. 匹配第三个li标签

那么接下来再把刚才的re.s去掉,看一下它会有怎样的一个匹配结果,因为re.s它是可以匹配换行符的,那么把re.s去掉,那么可以看看它第一个符合条件的结果是什么,

还注意到有第三个标签,第三个li标签是带有active这个class,那么其它的都没有,那么再把active的地方再去掉,

result=re.search(‘<li.*? singer=”(.*?)”>(.*?)</a>’, html)

If result:

Print(result.group(1), result.group(2))

运行一下,正常运行之后,可以看到第一个匹配结果,就是这个beyond 光辉岁月这个地方的结果。

那么也就是说从第一个第二个第三个标签都不符合这个换行符,也就是说.是不能代替这个不能代替换行符的,直到第四个,那么它是没有这个换行符的所以它找到了第一个匹配的结果那就是第四个li标签,也就是beyond 光辉岁月。

那么通过以上的三个例子,就对re.search这个方法有了一个初步的认识。

 

二、re.findal l方法

那么接下来再看一下re.findall方法,那么这个re.search方法它是找寻一个结果的,那么这个re.findall方法它是查询所有符合条件的,所有结果的。那么接下来就用这个re.findall,然后加一个正侧表达式,然后看一下它的结果是什么。

1. re.findall方法步骤

那么照样再筛选一下这个li标签,然后再把所有的带有这个超链接的内容匹配一下。这个超链接的内容,就用小括号括起来把这个内容提取出来,然后后面再把这个歌手信息也提取出来,然后加一个singer=”(.*?)”,外面用一个双引号给它引起来,接下来再把这个歌名信息给它加进来。然后再用这个小括号,然后.*?给它匹配过来。然后后面在把A标签的右标签,然后再把字符串传过来,然后再加一个re.s匹配换行符。然后再把result打印输出一下,看一下它的一个更新结果是什么。

result=re.findall(‘<li.*?href=”(.*?)”.*?singer=”(.*?)”>(.*?)</a>’, html,re.S)

Print(results)

2.查看结果类型

那么打印出来之后,可以看到它输出的是一个列表的显示。然后这个列表有五个元素,每个元素都是一个元组的形式,把这个results用type然后获取一下,看它的类型是什么。

result=re.findall(‘<li.*?href=”(.*?)”.*?singer=”(.*?)”>(.*?)</a>’, html,re.S)

Print(results)

Print(type(results))

那么它打印的类型,就是这是list,这个list肯定要去每个元素的话,肯定需要编译一下,那么for循环把每个元素取出来。用for result   in results,然后再把每个result打印出来。

results=re.findall(‘<li.*?href=”(.*?)”.*?singer=”(.*?)”>(.*?)</a>’, html,re.S)

print(results)

print(type(results))

for result in results:

print(result)

可以看到这个运行结果,就是每个result都是一个元子的形式,那么这个元子的长度就是三个。

3.获取每一个结果

然后。把它的每一个结果取出来result【0】,result【1】。

results=re.findall(‘<li.*?href=”(.*?)”.*?singer=”(.*?)”>(.*?)</a>’, html,re.S)

print(results)

print(type(results))

for result in results:

print(result)

print(result【0】,result【1】, result【2】)

原子的每一个结果取出来,那么可以看到它正常的输出了它的超链接,然后还有这个歌手,然后还有歌名。

这样的话,就用这个re.findall方法把所有符合条件的这些信息都找出来了,也就是说它既有超链接,就有歌手信息,那么这样的话,就可以用这个re.findall方法,然后找到所有符合这个正则表达式的字符串,然后将它们的内容找出来了。

4.匹配所以歌名

有些小伙伴可能就会问了,刚才匹配到的是从第二个标签开始匹配的,那么刚才第一个标签并没有匹配到内容,因为它里面没有一个超链接,那么如果想要匹配所有的这个歌名,那怎么办呢?

那么在这里再写一个正确表达式。首先把这个li标签开头写一下,然后再把li标签的结尾写一下。

那么接下来就需要写一个关于换行,不换行的一个问题,因为在第四个或者第五个它是没有换行的,那么第二个第三个它是有换行的,所以说在这里就加一个\s代表一个空白字符,但是这个空白字的可能有可能没有,所以就直接加一个*?,那么*代表可以匹配可能有多个活动空白字符,问号代表有还是没有,那么这样的话就可以匹配它是否有这个换行符,那么接下来再写这个a标签,那么a标签可能是有可能没有的,那么这个小括号还有一个功能,就是说它可以把这个括起来内容做成一个整体。再看一下前面的这个内容,那么也就是说它可以匹配括号内的表达式,那么它也表示这么一个组,也就是说用小括号括起来之后,它也表示为一个整体。那么可以看一下这个a标签它可能是有的可能没有,所以说可以加一个问号来表示,那这个问号就代表匹配零个或者是一个。

那么接下来再加一个沧海一声笑一些歌名的一个匹配,那么它是一个字符串,那么就用\w,然后再加号来匹配一下,然后后面再加一个a标签的是否有,是否没有,作为一个整体。

然后后面再加一个关于一个换行空白符匹配,然后再加一个li标签,这样的话就完成了这个政策表达式的写法,然后再把这个字符串传过来,然后加一个re.s。

results=re.findall(‘<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?</li>’, html,re.S)

print(results)

那么这样的话,就可以看一下运行结果。它也是输出了一个列表的显示,那么这个列表,它都是一个元组的形式组成的,那么元组的第一个内容,第一个结果它是空的,那么第二个结果,它是正常的匹配出这个超链接。所以说这个小括号,它既能表是一个整体,但是在表示整体的同时,它也会作为这么一个匹配的分组,在打印输出的结果里面呈现出来。

results=re.findall(‘<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?</li>’, html,re.S)

print(results)

print(result【1】)

再把这个results变一下,输出一下,那么这样的话,就可以拿到所有的这个歌名信息了,那么以上,这也是作为一个匹配的一个练习的用re.findall方法,然后找出所有的歌名信息,那么这个其实还是相对于比较难写的,可以体会一下。

相关文章
java202303java学习笔记第二十七天-正则表达式之3
java202303java学习笔记第二十七天-正则表达式之3
78 0
java202303java学习笔记第二十八天-正则表达式基本练习2
java202303java学习笔记第二十八天-正则表达式基本练习2
124 0
java202303java学习笔记第二十八天-正则表达式基本练习1
java202303java学习笔记第二十八天-正则表达式基本练习1
156 0
java202303java学习笔记第二十八天-正则表达式基本练习3 原
java202303java学习笔记第二十八天-正则表达式基本练习3 原
94 0
java202303java学习笔记第二十七天-正则表达式基本练习1
java202303java学习笔记第二十七天-正则表达式基本练习1
136 0
java202303java学习笔记第二十七天-正则表达式之2
java202303java学习笔记第二十七天-正则表达式之2
154 0
java202303java学习笔记第二十七天-正则表达式之1
java202303java学习笔记第二十七天-正则表达式之1
177 0
java202303java学习笔记第二十七天-正则表达式之4
java202303java学习笔记第二十七天-正则表达式之4
85 0
java202303java学习笔记第二十七天-正则表达式之3
java202303java学习笔记第二十七天-正则表达式之3
75 0
|
开发者 Python
正则表达式4|学习笔记
快速学习正则表达式4
正则表达式4|学习笔记