re模块与正则表达式的关系
正则表达式是一门独立的技术,所有的编程语言都可以使用,但是如果想在python中使用,就必须依赖于re模块。
正则就是用来筛选特定内容的表达式,在python中 一般情况下 reg都是与正则有关
如果想匹配具体的内容,可以直接写完整的内容,不需要写正则。
字符组 [ ] 一个字符串里面的表达式都是或的关系 ,abc|ab 这种写法一定要将唱的放在前面
^与$连用,会精准限制匹配的内容,即两者中间写的什么,匹配的字符串就必须是什么
^直接写在外面,限制字符串的开头 [^] 除了[]写的字符 其他都保留
正则在匹配的时候默认是贪婪匹配的(尽可能多的匹配),但是可以在量词后面加上一个?,讲贪婪匹配转变成非贪婪匹配(惰性匹配)
量词必须跟在正则符号的后面,只能跟一个限制符号
分组:当多个正则符号需要重复多次的时候或者当做一个整体进行其他操作,那么可以分组的形式
分组在正则的语法中就是()
findall
res = re.findall('[a-z]+','eva egon jason') # findall('正则表达式','带匹配的字符串') print(res)
找出字符串中符合正则表达式全部内容 并且返回的是一个列表,列表中的元素就是正则匹配到的结果
search
res = re.search('a','eva egon jason') print(res) # search不会给你直接返回匹配到的结果 而是给你返回一个对象 print(res.group()) # 必须调用group才能看到匹配到的结果
search不会给你直接返回匹配到的结果 而是给你返回一个对象,必须调用group才能看到匹配到的结果
注意:
1.search只会依据正则查一次 只要查到了结果 就不会再往后查找
2.当查找的结果不存在的情况下 调用group直接报错
match
res1 = re.search('a','eva egon jason') # search('正则表达式','带匹配的字符串') if res1: print(res1.group()) res = re.match('a','eva egon jason') print(res) print(res.group())
注意:
1.match只会匹配字符串的开头部分
2.当字符串的开头不符合匹配规则的情况下 返回的也是None 调用group也会报错
补充:
ret = re.split('[ab]', 'abcd') 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 print(ret) ['', '', 'cd'] 返回的还是列表 ret = re.sub('\d', 'H', 'eva3egon4yuan4',1) 将数字替换成'H',参数1表示只替换1个 sub('正则表达式','新的内容','待替换的字符串',n) """ 先按照正则表达式查找所有符合该表达式的内容 统一替换成'新的内容' 还可以通过n来控制替换的个数 """ print(ret) evaHegon4yuan4 ret = re.subn('\d', 'H', 'eva3egon4yuan4') 将数字替换成'H',返回元组(替换的结果,替换了多少次) ret1 = re.subn('\d', 'H', 'eva3egon4yuan4',1) 将数字替换成'H',返回元组(替换的结果,替换了多少次) print(ret) 返回的是一个元组 元组的第二个元素代表的是替换的个数 obj = re.compile('\d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字 ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串 res1 = obj.findall('347982734729349827384') print(ret.group()) #结果 : 123 print(res1) #结果 : ['347', '982', '734', '729', '349', '827', '384']
正则在爬虫中的应用
import re import json from urllib.request import urlopen """ 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= <li> <div class="item"> <div class="pic"> <em class="">1</em> <a href="https://movie.douban.com/subject/1292052/"> <img width="100" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class=""> </a> </div> <div class="info"> <div class="hd"> <a href="https://movie.douban.com/subject/1292052/" class=""> <span class="title">肖申克的救赎</span> <span class="title"> / The Shawshank Redemption</span> <span class="other"> / 月黑高飞(港) / 刺激1995(台)</span> </a> <span class="playable">[可播放]</span> </div> <div class="bd"> <p class=""> 导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br> 1994 / 美国 / 犯罪 剧情 </p> <div class="star"> <span class="rating5-t"></span> <span class="rating_num" property="v:average">9.6</span> <span property="v:best" content="10.0"></span> <span>1489907人评价</span> </div> <p class="quote"> <span class="inq">希望让人自由。</span> </p> </div> </div> </div> </li> """ def getPage(url): response = urlopen(url) return response.read().decode('utf-8') def parsePage(s): com = re.compile( '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>' '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S) ret = com.finditer(s) for i in ret: yield { "id": i.group("id"), "title": i.group("title"), "rating_num": i.group("rating_num"), "comment_num": i.group("comment_num"), } def main(num): url = 'https://movie.douban.com/top250?start=%s&filter=' % num response_html = getPage(url) ret = parsePage(response_html) print(ret) f = open("move_info7", "a", encoding="utf8") for obj in ret: print(obj) data = str(obj) f.write(data + "\n") count = 0 for i in range(10): main(count) count += 25