Python爬虫基础之正则表达式

一、Python正则表达式的基本使用

 Python 3 使用re模块可以实现大部分的正则表达式情况。

1.re.compile(pattern, flags=0)

 re.compile构建匹配规则并返回一个正则表达式对象,这样的好处就是可以多次使用这个匹配规则,通过调用它的match()和search()方法或作为re.match和re.search的pattern参数来匹配字符串。

 1 html_doc = "www.cnblogs.com"
 2 pattern = re.compile('www')  # 实例化pattern 对象
 3 match = re.match(pattern,html_doc)  # 或者 match = pattern.match(html_doc)
 4 
 5 if match:  # www不在字符串开始位置,匹配成功
 6     print(match.group(0))
 7 else:
 8     print("not match com")
 9 
10 # 打印
11 # www

 

2.re.match(pattern, string, flags=0)

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

匹配成功re.match方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

 1 html_doc = "www.cnblogs.com"
 2 if re.match("www", html_doc):  # www在字符串开始位置,匹配成功
 3     print(re.match("www", html_doc).group(0)) 
 4 else:
 5     print("not match www")
 6 
 7 if re.match("com", html_doc):  # com不在字符串开始位置,匹配失败
 8     print(re.match("com", html_doc).group(0))
 9 else:
10     print("not match com")
11 
12 # 打印
13 # www
14 # not match com

 

3.re.search(pattern, string, flags=0)

 re.search 扫描整个字符串并返回第一个成功的匹配。

匹配成功re.search方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

 1 html_doc = "www.cnblogs.com"
 2 if re.search("www", html_doc):  # www在字符串开始位置,匹配成功
 3     print(re.search("www", html_doc).group(0)) 
 4 else:
 5     print("not match www")
 6 
 7 if re.search("com", html_doc):  # com不在字符串开始位置,匹配成功
 8     print(re.search("com", html_doc).group(0))
 9 else:
10     print("not match com")
11 
12 # 打印
13 # www
14 # com

 

4.re.sub(pattern, repl, string, count=0)

 re.sub用于替换字符串中的匹配项。

repl : 替换的字符串,也可为一个函数;string : 要被查找替换的原始字符串;count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

 

1 html_doc = "http://www.cnblogs.com"
2 pattern = re.compile('http')  # 实例化pattern 对象
3 html_doc_after_sub = re.sub(pattern, "https", html_doc)
4 print(html_doc_after_sub)
5 
6 # 打印
7 # https://www.cnblogs.com

 

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

re.findall查找所有满足pattern匹配规则的字符串,而不像re.match和re.search找到一个满足匹配规则的字符串就直接返回。

1 html_doc = "He was carefully disguised but captured quickly by police."
2 pattern = re.compile(r'\w+ly')  # 查找所有以ly结尾的单词
3 results = re.findall(pattern, html_doc)
4 print(results)
5 
6 # 打印
7 # ['carefully', 'quickly']

 

二、Python正则表达式的实际应用

 1 <ul class="m-cvrlst f-cb" id="m-pl-container"> 
 2    <li> 
 3     <div class="u-cover u-cover-1"> 
 4      <img class="j-flag" src="http://p1.music.126.net/FGe-rVrHlBTbnOvhMR99PQ==/109951162989189558.jpg?param=140y140" /> 
 5      <a title="【说唱】留住你一面,画在我心间" href="/playlist?id=832790627" class="msk"></a> 
 6      <div class="bottom"> 
 7       <a class="icon-play f-fr" title="播放" href="javascript:;" data-res-type="13" data-res-id="832790627" data-res-action="play"></a> 
 8       <span class="icon-headset"></span> 
 9       <span class="nb">1615</span> 
10      </div> 
11     </div> <p class="dec"> <a title="【说唱】留住你一面,画在我心间" href="/playlist?id=832790627" class="tit f-thide s-fc0">【说唱】留住你一面,画在我心间</a> </p> <p><span class="s-fc4">by</span> <a title="JediMindTricks" href="/user/home?id=17647877" class="nm nm-icn f-thide s-fc3">JediMindTricks</a> <sup class="u-icn u-icn-84 "></sup> </p> </li> 
12    <li> 
13     <div class="u-cover u-cover-1"> 
14      <img class="j-flag" src="http://p1.music.126.net/If644P7ZrfPm_qcvtYyfzg==/18936888765458653.jpg?param=140y140" /> 
15      <a title="鞋子好看|国产自赏摇滚噪音流行" href="/playlist?id=721462105" class="msk"></a> 
16      <div class="bottom"> 
17       <a class="icon-play f-fr" title="播放" href="javascript:;" data-res-type="13" data-res-id="721462105" data-res-action="play"></a> 
18       <span class="icon-headset"></span> 
19       <span class="nb">77652</span> 
20      </div> 
21     </div> <p class="dec"> <a title="鞋子好看|国产自赏摇滚噪音流行" href="/playlist?id=721462105" class="tit f-thide s-fc0">鞋子好看|国产自赏摇滚噪音流行</a> </p> <p><span class="s-fc4">by</span> <a title="原创君" href="/user/home?id=201586" class="nm nm-icn f-thide s-fc3">原创君</a> <sup class="u-icn u-icn-1 "></sup> </p> </li> 
22   </ul>

开始解析html源码

首先实例化一个正则表达式pattern对象,匹配规则r'<img class="j-flag" src="(.*?)" />',通过re.findall匹配到所有的img标签的src属性,保存在列表results_img_url中.再通过re.findall匹配到所有满足匹配规则r'<a title="(.*?)" href="(.*?)" class="msk"></a>'的按标签,

并提取属性title和href,保存在元祖中。

 1 import re
 2 
 3 pattern_img = re.compile(r'<img class="j-flag" src="(.*?)" />')
 4 results_img_url = re.findall(pattern_img,html_doc)
 5 print(results_img_url)
 6 # 打印 ['http://p1.music.126.net/FGe-rVrHlBTbnOvhMR99PQ==/109951162989189558.jpg?param=140y140', 'http://p1.music.126.net/If644P7ZrfPm_qcvtYyfzg==/18936888765458653.jpg?param=140y140']
 7 pattern_a = re.compile(r'<a title="(.*?)" href="(.*?)" class="msk"></a>')
 8 results_a = re.findall(pattern_a, html_doc)
 9 print(results_a)
10 # 打印 [('【说唱】留住你一面,画在我心间', '/playlist?id=832790627'), ('鞋子好看|国产自赏摇滚噪音流行', '/playlist?id=721462105')]

 

posted @ 2017-08-08 19:15  漏网的鱼和漏鱼的网  阅读(401)  评论(0编辑  收藏  举报