正则表示 re.findall 用法
felicx 化神

前言

re.findall作用是搜索字符串,以列表形式返回能匹配的字符。

形式

1
re.findall(pattern, string, flags=0)

该方法有3个参数,第一个就是你写的正则表达式,第二个匹配的目标字符串,第三个是一个匹配模式。

练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#search是找一个结果的,findall是查询所有结果的。
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="邓丽君">但愿人长久</a>
</li>
</ul>
</div>

练习1:

要求:匹配出li标签中既有歌手又有歌名的信息,包括超链接也匹配出来。
分析:我们可以看出排除了歌曲”一路有你”,其余的歌曲,歌手,以及超链接都要匹配出来。

1
2
3
4
5
6
7
results = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>',html,re.S)
print(results) #返回list,元素由tuple组成
for result in results:
print(result) #返回每个tuple元素

# 输出
[(’/2.mp3’, ‘任贤齐’, ‘沧海一声笑’), (’/3.mp3’, ‘齐秦’, ‘往事随风’), (’/4.mp3’, ‘beyond’, ‘光辉岁月’), (’/5.mp3’, ‘陈惠琳’, ‘记事本’), (’/6.mp3’, ‘邓丽君’, ‘但愿人长久’)]

练习2:

要求:对上述html代码匹配出所有歌名。

1
2
3
4
5
6
# * 表多个 ?表示前面匹配有或者没有,就到前面
results = re.findall('<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>',html,re.S)
print(results)

# 输出
[(’’, ‘一路上有你’, ‘’), (’’, ‘沧海一声笑’, ‘’), (’’, ‘往事随风’, ‘’), (’’, ‘光辉岁月’, ‘’), (’’, ‘记事本’, ‘’), (’’, ‘但愿人长久’, ‘’)]

练习3:

要求:对于string类型数据,筛选出两个子串之间的内容

1
2
3
4
5
6
7
8
9
10
11
s_data = '{"STGraph": {"Index": 10,"planning" : ["Now: 1390.04, Gap: 0.10"],"mp_intention" : { "maneuver_name": "FOLLOW", "scenario": 0, "flag_to_stop": 0}}}'

# re.findall格式为re.findall('sub_str_a, sub_str_b', str_data, re.S),返回list
result_1 = re.findall('.*?"planning" :(.*?),"mp_intention"', s_data, re.S)
# [' ["Now: 1390.04, Gap: 0.10"]']
result_2 = re.findall('.*?"planning" :.*?,"mp_intention"', s_data, re.S)
# ['{"STGraph": {"Index": 10,"planning" : ["Now: 1390.04, Gap: 0.10"],"mp_intention"']
result_3 = re.findall('(.*?)"planning" :.*?,"mp_intention"', s_data, re.S)
# ['{"STGraph": {"Index": 10,']
result_4 = re.findall('(.*?)"planning" :(.*?),"mp_intention"', s_data, re.S)
# [('{"STGraph": {"Index": 10,', ' ["Now: 1390.04, Gap: 0.10"]')]
 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量