python中的re模块
一.re模块中的基本功能:
1.查找
1.1 findall:匹配所有每一项符合的结果都会放到列表中,作为一个元素
用法:re.findall('正则表达式','待匹配的字符串',falg)
1 ret=re.findall('\d+','东方红5546fuy465胡')
2 print(ret)#['5546', '465']
1.2 search:只匹配符合条件的从左到右的第一个,得到的不是一个结果,而是一个变量,通过这个变量的group方法来获取结果
如果没有匹配到,会返回none,使用group方法会报错
1 ret=re.search('\d+','东方红5546fuy465胡')
2 print(ret) #<_sre.SRE_Match object; span=(3, 7), match='5546'>
3 print(ret.group()) #5546
4
5 ret=re.search('_','东方红5546fuy465胡')
6 print(ret) #None
7 print(ret.group()) # 'NoneType' object has no attribute 'group'
1.3 match:从头开始匹配,相当于在search中加上一个'^'
1 ret=re.match('\d+','东方红5546fuy465胡')
2 print(ret) #None
3
4 ret1=re.match('\d+','12东方红5546fuy465胡')
5 print(ret1.group()) #12
2.字符串处理:替换切割
2.1split:切割
1 s='21东方红5546fuy465胡'
2 ret=re.split('\d+',s)
3 print(ret) #['', '东方红', 'fuy', '胡']
4
5 s='21东方红5546fuy465胡'
6 ret=re.split('\d',s)#切一的时候默认前面有一个空字符串
7 print(ret) #['', '', '东方红', '', '', '', 'fuy', '', '', '胡']
2.1 sub:替换 sub(旧的 新的 谁 替换次数(默认全部替换))
1 ret=re.sub('\d','@@@','12东方红5546fuy465胡')
2 print(ret)#@@@@@@东方红@@@@@@@@@@@@fuy@@@@@@@@@胡
3
4 ret=re.sub('\d+','@@@','12东方红5546fuy465胡')
5 print(ret) #@@@东方红@@@fuy@@@胡
6
7 subn 返回的是一个元组,元祖的第二个元素是替换的次数
8 ret=re.subn('\d+','@@@','12东方红5546fuy465胡')
9 print(ret) #('@@@东方红@@@fuy@@@胡', 3)
3. re模块的进阶: 时间 空间
3.1 compile(编译的意思):节省你使用正则表达式解决问题的时间
1 ret=re.compile('\d+')
2 print(ret) #re.compile('\\d+') 编译后的正则表达式
3 ret1=ret.findall('12东方红5546fuy465胡')
4 print(ret1) #['12', '5546', '465']
5
6 ret=re.compile('\d+')
7 ret1=ret.search('12东方红5546fuy465胡')
8 print(ret1.group()) #12
9 ret2=ret.match('12东方红5546fuy465胡')
10 print(ret2.group()) #12
3.2 finditer :节省你使用正则表达式的空间/内存,返回一个迭代器,需要的话可以循环+group()或者__next__+group()
1 ret=re.finditer('\d+','12东方红5546fuy465胡')
2 # print(ret)
3 # for i in ret:
4 # print(i.group())
5 # 12
6 # 5546
7 # 465
8
9 # ret=re.finditer('\d+','12东方红5546fuy465胡')
10 # print(ret.__next__().group()) #12
4 .分组在re模块中的使用
之前
1 s='<a>wahaha</a>' #是一个标签语言 HTML网页 <a>表示开始 </a>表示结束
2 ret=re.search('>\w+<',s)
3 print(ret.group())
4.1
1 s='<a>wahaha</a>'
2 ret=re.findall('<\w+>(\w+)</(\w+)>',s)
3 print(ret) #为了方便,优先使用显示分组中的内容
4.2
1 s='<a>wahaha</a>'
2 ret=re.search('>(\w+)<',s)
3 print(ret.group())
4 print(ret.group(1)) #数字代表取对应分组中的内容
4.3 取消分组优先(?:正则表达式)
ret=re.findall('\d+(?:.\d+)?','1.234*56')
print(ret) #['1.234', '56']
4.4 分组与split方法
1 ret = re.split('\d+','alex83taibai40egon25')
2 print(ret) #['alex', 'taibai', 'egon', '']
3 ret = re.split('(\d+)','alex83taibai40egon25aa')
4 print(ret) #['alex', 'taibai', 'egon', '']
4.5.1分组命名 (?P<这个组的名字>正则表达式)
1 s='<a>wahaha</a>'
2 ret=re.search('<(?P<start>\w+)>(?P<content>\w+)<(?P<end>/\w+)>',s)
3 print(ret.group(1)) #a 也可以使用序号
4 print(ret.group('start')) #a
4.5.2 分组名相同
1 partten='<(?P<start>\w+)>(?P<content>\w+)</(?P=start)>'
2 s='<a>wahaha</a>'
3 ret=re.search(partten,s)
4 print(ret.group()) #<a>wahaha</a>
5 禁止转义(原样输出) r
ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))") #此处的r是禁止转义的意思
# print(ret)
# print('qwert')
# print('qwert\n') #此时输出qwert和一个空行
# print('qwert\\n') #此时输出qwert\n
# print(r'qwert\n') #此时输出qwert\n
# print(r'qwert\\n') #此时输出qwert\\n
二.爬虫实例
将序号,电影,评分和评价人数爬下来
1 import re
2 from urllib.request import urlopen
3
4 def getpage(url): #获取网页的字符串
5 response=urlopen(url)
6 return response.read().decode('utf-8')
7
8 def parsepage(s):
9 ret=com.finditer(s)
10 for i in ret:
11 yield {
12 'id':i.group('id'),
13 'name':i.group('name'),
14 'score':i.group('score'),
15 'speak':i.group('speak'),
16 }
17
18 def main(num):
19 url='https://movie.douban.com/top250?start=%s&filter=' % num
20 respoese_html=getpage(url) #得到的是当前那页网页的所有字符串的str
21 ret=parsepage(respoese_html) #得到的是一个生成器
22 print(ret)
23 for i in ret:
24 print(i)
25
26 com=re.compile(
27 '<div class="item">.*?<em class="">(?P<id>\d+)</em>.*?<span class="title">(?P<name>.*?)</span>.*?'
28 '<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<speak>.*?)</span>',re.S)
29
30 count=0
31 for i in range(10):
32 main(count)
33 count+=25 #此网页的特点是25个电影一页
改变世界,改变自己!