前言 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 import rehtml='''<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) for result in results: print (result) [(’/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}}}' result_1 = re.findall('.*?"planning" :(.*?),"mp_intention"' , s_data, re.S) result_2 = re.findall('.*?"planning" :.*?,"mp_intention"' , s_data, re.S) result_3 = re.findall('(.*?)"planning" :.*?,"mp_intention"' , s_data, re.S) result_4 = re.findall('(.*?)"planning" :(.*?),"mp_intention"' , s_data, re.S)