正则表达式regex学习笔记

来源:互联网 发布:堆和栈的区别java 编辑:程序博客网 时间:2024/05/20 19:15
  • 正则表达式:
    • .*? 可以代表一切字符(除换行,可用re.S参数变成所有字符)
    • \d 为数字 \s 为空格  例子:(\d+)为小组或目标是多个数字
    • .* 和 .*? 前者为贪婪模式,后者非贪婪
    • ^为开头 $为结尾
    • (.*?)?表示这个目标可能出现,可能不出现
    • .strip()为字符串的函数,可以删除\n这些换行符
    • re.match从第一个字符开始匹配
    • re.search扫描整个字符串
    • re.findall找出全部
    • re.sub替换 例子re.sub(‘\s’,’ ’,content)用空格替换content中的换行符、空白、
    • pattern=re.compile()用于制作pattern,匹配模式
      • 一般用作 re.findall(pattern,content)
    • 匹配出来的结果.group(1)表示你第一个目标(.*?)

  • 利用正则来获取猫眼电影top100
    • 首先get()获取网页源代码
    • 利用re解析代码,获取你想要的信息
    • 分析网址结构,构造网址的函数
    • 储存为字典、或存入数据库

代码如下:
import jsonimport reimport requestsfrom requests.exceptions import RequestExceptionfrom multiprocessing import Pooldef get_html(url):    headers = {        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) '                      'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'    }    try:        html = requests.get(url,headers=headers)        if html.status_code == 200:                 # 返回200 表示正常运行          return(html.text)        return None    except RequestException:                # 捕获RequestException        return Nonedef parse_url(content):    pattern = re.compile('<dd>.*?<i\sclass="board-index\sboard-index.*?>(\d+)</i>'                         +'.*?data-src="(.*?)".*?</a>.*?name.*?title="(.*?)".*?star">(.*?)</p>.*?releasetime">'                         +'(.*?)</p>',re.S)        # 制作正则pattern \s空格,.*?所有字符, (.*?)目标, pattern换行' '+' '    items = re.findall(pattern,content)    print(items)    for item in items:        yield{              # 安排获取的目标的顺序,删除目标的多余换行符,将目标构造成字典            'title': item[2],            'rank': item[0],            'image': item[1],            'class': item[3].strip(),            'year': item[4]        }    #print(type(item))   {}为字典dict,()为元组tuple, []为列表listdef write_to_file(content):    with open('result.txt', 'a') as f:        f.write(json.dumps(content,ensure_ascii=False) + '\n')        f.close()def main(offset):    url = "http://maoyan.com/board/4?offset=" +str(offset)    html = get_html(url)    #print(html)    #parse_url(html)    for item in parse_url(html):        print(item)        write_to_file(item)if __name__ == "__main__":    pool = Pool()                       # multiprocessing.Pool进程池,pool,map(方法,参数列表)    pool.map(main, [i*10 for i in range(10)])


原创粉丝点击