25_re模块

一、re模块的核心功能
 
    1、findall —— 查找所有,返回list
1 lst = re.findall("m", "mai le fo len, mai ni mei!")
2 print(lst) # ['m', 'm', 'm']
3 lst = re.findall(r"\d+", "5点之前. 你要给我5000万")
4 print(lst) # ['5', '5000']

    2、finditer —— 和findall差不多,返回的是迭代器

1 it = re.finditer("m", "mai le fo len, mai ni mei!")
2 for el in it:
3     print(el.group()) # 依然需要分组

 3、search —— 会进行批评,但是如果匹配到了第一个结果,就返回这个结果。如果匹配不上search返回None

1 ret = re.search(r'\d', '5点之前. 你要给我5000万').group()
2 print(ret) # 5

    4、match —— 只能从字符串的开头进行匹配

1 ret = re.match('a', 'abc').group()
2 print(ret) # a
    5、其他操作
 1 ret = re.split('[ab]', 'qwerafjbcd') # 先按'a'分割得到'qwer'和'fjbcd',在对'qwer'和'fjbcd'分别按'b'分割
 2 print(ret) # ['qwer', 'fj', 'cd']
 3 
 4 ret = re.sub(r"\d+", "_sb_", "alex250taibai250wusir250ritian38") # 把字符串中的数字换成__sb__
 5 print(ret) # alex_sb_taibai_sb_wusir_sb_ritian_sb_
 6 
 7 ret = re.subn(r"\d+", "_sb_", "alex250taibai250wusir250ritian38") # 将数字替换成'__sb__',返回元组(替换的结果,替换了多少次)
 8 print(ret) # ('alex_sb_taibai_sb_wusir_sb_ritian_sb_', 4)
 9 
10 obj = re.compile(r'\d{3}') # 将正则表达式编译成为⼀个 正则表达式对象, 规则要匹配的是3个数字
11 ret = obj.search('abc123eeee') # 正则表达式对象调⽤search, 参数为待匹配的字符串
12 print(ret.group()) # 结果: 123
    6、爬虫(重点)
1 obj = re.compile(r'(?P<id>\d+)(?P<name>e+)') # 从正则表达式匹配的内容每个组起名字
2 ret = obj.search('abc123eeee') # 搜索
3 print(ret.group()) # 结果: 123eeee
4 print(ret.group("id")) # 结果: 123 # 获取id组的内容
5 print(ret.group("name")) # 结果: eeee # 获取name组的内容
注意: 在re模块中和我们在线测试⼯具中的结果可能是不⼀样的
 1 ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
 2 print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组⾥内容返回,如果想要匹配结果,取消权限即可
 3 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
 4 print(ret) # ['www.oldboy.com']
 5 
 6 ret=re.split("\d+","eva3egon4yuan")
 7 print(ret) #结果 : ['eva', 'egon', 'yuan']
 8 ret=re.split("(\d+)","eva3egon4yuan")
 9 print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']
10 #在匹配部分加上()之后所切出的结果是不同的,
11 #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
12 #这个在某些需要保留匹配部分的使⽤过程是⾮常重要的。
爬取豆瓣网
 1 import ssl
 2 import re
 3 from urllib.request import urlopen
 4 
 5 ssl._create_default_https_context = ssl._create_unverified_context   # ⼲掉数字签名证书
 6 def getPage(url):
 7     response = urlopen(url)
 8     return response.read().decode('utf-8')
 9 
10 def parsePage(s):
11     com = re.compile(com = re.compile(
12          '<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>'+
13          '(?P<comment_num>.*?)评价</span>', re.S)
14      ret = com.finditer(s)
15      for i in ret:
16          yield {
17              "id": i.group("id"),
18              "title": i.group("title"),
19              "rating_num": i.group("rating_num"),
20              "comment_num": i.group("comment_num"),
21          }
22 def main(num):
23      url = 'https://movie.douban.com/top250?start=%s&filter=' % num
24      response_html = getPage(url)
25      print(response_html)
26      ret = parsePage(response_html)
27      # # print(ret)
28      f = open("move_info7", "a", encoding="utf8")
29      for obj in ret:
30         print(obj)
31         data = str(obj)
32         f.write(data + "\n")
33 
34 
35 count = 0
36 for i in range(10):
37     main(count)
38     count += 25

 

posted @ 2018-10-15 17:24  qi.hu  阅读(141)  评论(0编辑  收藏  举报