re.findall:https://www.cnblogs.com/xieshengsen/p/6727064.html
自己爬虫遇到的一些例子:
<a href="/song?id=287063">我怀念的</a>
<a href="/song\?id=\d+">(.*?)</a>,其中?匹配需要转义,\d表示匹配[0-9],\d+表示匹配多位数字
<dd>
<i class="board-index board-index-1">1</i>
<a href="/films/1203" title="霸王别姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}">
<img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
<img data-src="https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c" alt="霸王别姬" class="board-img" />
</a>
<div class="board-item-main">
<div class="board-item-content">
<div class="movie-item-info">
<p class="name"><a href="/films/1203" title="霸王别姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王别姬</a></p>
<p class="star">
主演:张国荣,张丰毅,巩俐
</p>
<p class="releasetime">上映时间:1993-07-26</p> </div>
<div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">5</i></p>
</div>
</div>
</div>
</dd>
这是猫眼电影爬虫的匹配,要得到电影排名,电影链接,电影名称,电影主演,电影上映时间等信息,用正则进行匹配(感觉很随意,用了很多贪婪匹配):
<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
+ '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
+ '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>'
1. 去掉逗号和空格
[]:匹配内部的任一字符或子表达式
+:匹配前一个字符或子表达式多次
import re some_text = 'a,b,,,,c d' reObj = re.compile('[, ]+') list=reObj.split(some_text) print(list)
import re some_text = 'a,b,,,,c d' re.split('[, ]+',some_text)
输出:['a', 'b', 'c', 'd']
2.找出含有某个字母的单词
\w:匹配任意字母数字下划线
*:匹配前面的字符或者子表达式0次或者多次
import re text="JGod is a handsome boy ,but he is a ider" print re.findall(r'\w*o\w*',text) #查找有o的单词
import re text="JGod is a handsome boy ,but he is a ider" regex=re.compile(r'\w*o\w*') #r 表示原生字符串 print regex.findall(text)
输出: ['JGod', 'handsome', 'boy']
正则表达式中的三组括号把匹配结果分成三组,group() 同group(0)就是匹配正则表达式整体结果,group(1):列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。若没有匹配成功的,re.search()返回None。
[0-9]:0123456789任意之一
[a-z]:小写字母任意之一
[A-Z]:大写字母任意之一
注意:这里只能用search,返回的是str类型,后面有group函数,而find和findall函数返回的都是列表,不能用group
import re a = "123abc456" print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体 print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) #123 print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) #abc print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) #456