import re
re.findall('需要配陪的规则','被匹配的内容内容')
(.)点代表通配符,但他不能替代 这个
(^a)被匹配的内容必须以a开头的字符串
(a$)被匹配的内容必须以a结尾的字符串
(a*)a可以被重复0到无穷次数
(a+)a必须要有1次或者1次以上
(a{1,4}) a必须含有1到4个必须要有一个但是不能超过4个以上
(a?)a可以不出现也可以出现
d 匹配任何十进制数; 它相当于类 [0-9]。 D 匹配任何非数字字符; 它相当于类 [^0-9]。 s 匹配任何空白字符; 它相当于类 [ fv]。 S 匹配任何非空白字符; 它相当于类 [^ fv]。 w 匹配任何字母数字字符; 它相当于类 [a-zA-Z0-9_]。 W 匹配任何非字母数字字符; 它相当于类 [^a-zA-Z0-9_] 匹配一个特殊字符边界,比如空格 ,&,#等
(())匹配括号内的
search()模块
ret=re.search('条件',‘匹配内容’)
search只匹配成功内容的第一个内容
print(ret.group())
match()模块
ret=re.match('条件','匹配内容')
仅仅匹配开头是满足条件
print(ret.group())
如果我们想用.匹配所有的
那么我们需要re.findall('','',re.s)
贪婪模式:
例如(‘abc+’,‘abccccccccb’)
他会一直匹配到不满足条件在停止
这种方式叫贪婪匹配
非贪婪模式
例如(‘abc+?’,‘abccccccccb’)
由于+号代表1-n所以会匹配最小1次就停止
也就是返回abc
s='aaaaa123bbbb'
re.split('d+',s)
打印效果
[aaaaa,bbbb]
re.split('d+',s,2)
会分两次分成3份
因为我们进行分割的时候通常分隔符是会丢弃的
既然已分隔符为条件那么我们就把它d+改成(d+)这样就可以了
re.sub('规则并且是要被替换掉的','新的内容',字符串)
像replace
re.compile:编译的意思
obj=re.compile('规则')
obj.findall('被匹配的字符串')
re.finditer(‘规则’,'内容') 相当于iter 可以返回一个迭代器对象
下面我们用正则遍历一下豆瓣
import requests
import re
import json
dic={}
l=["https://movie.douban.com/top250?start=0&filter=","https://movie.douban.com/top250?start=25&filter=","https://movie.douban.com/top250?start=50&filter=","https://movie.douban.com/top250?start=75&filter=","https://movie.douban.com/top250?start=100&filter=","https://movie.douban.com/top250?start=125&filter=","https://movie.douban.com/top250?start=150&filter=","https://movie.douban.com/top250?start=175&filter=","https://movie.douban.com/top250?start=200&filter=","https://movie.douban.com/top250?start=225&filter="]
ll=[]
def rr(url):
r=requests.get(url)
#print(type(respnse_str.text))
return r.text
def num(url):
res=rr(url)
obj=re.compile('<div class.*?>.*?<em.*?>(d+)</em>.*?<span class="title">(.*?)</span>.*?<p class="">.*?导演:(.*?)&.*?</p>.*?<div class="star">.*?<span>(.*?)</span>',re.S)
ret=obj.findall(res)
return ret
for i in l:
for b in num(i):
ll.append(b)
for i in ll:
dic[i[0]]={'名字':i[1],'导演':i[2],'评论数':i[3]}
w=open('movie.txt','w',encoding='utf-8')
json.dump(dic,w,sort_keys=True,indent=4,ensure_ascii=False