正则表达式

    xiaoxiao2025-11-15  12

    匹配单个字符

    字符 功能 . 匹配任意一个字符(除了\n) [] 匹配[]中列举的字符 \d 匹配数字母,即0-9 \D 匹配非数字 \s 匹配空白,即空格、tab \S 匹配非空白 \w 即匹配a-z,A-Z,0-9、_(慎用) \W 匹配非a-z,A-Z,0-9,_

    匹配多个字符:

    字符 功能 {n} 匹配前一个字符出现n次 {n,m} 匹配前一个字符出现n到m次 * 匹配前一个字符出现0次或者多次 + 匹配前一个字符出现1次或者多次 ? 匹配前一个字符出现0次或者1次

    匹配开头和结尾:

    字符 功能 $ 匹配字符串结尾 ^ 匹配字符串开头(只要是”^”这个字符是在中括号”[]”中被使用的话就是表示字符类的否定, 如果不是的话就是表示限定开头。我这里说的是直接在”[]”中使用, 不包括嵌套使用 。其实也就是说”[]”代表的是一个字符集,”^”只有在字符集中才是反向字符集的意思。)

    匹配分组

    字符 功能 | 匹配左右任意一个表达式 (ab) 将括号中字符作为一个分组 \num 引用分组num匹配到的字符串(比如想与第一个分组一样时,则用\1) (?P<name>) 分组起别名 (?P=name) 引用别名为name分组匹配到的字符串

    re模块的高级用法

    search(从开头找,只找一次) 需求:匹配出文章阅读的次数 #coding=utf-8 import re ret = re.search(r"\d+", "阅读次数为 9999") ret.group() 运行结果: '9999' findall(找出所有的符合条件的) 需求:统计出python、c、c++相应文章阅读的次数 #coding=utf-8 import re ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345") print(ret) 运行结果: ['9999', '7890', '12345'] sub 将匹配到的数据进行替换 需求:将匹配到的阅读次数加1 方法1: #coding=utf-8 import re ret = re.sub(r"\d+", '998', "python = 997") print(ret) 运行结果: python = 998 方法2: #coding=utf-8 import re def add(temp): strNum = temp.group() num = int(strNum) + 1 return str(num) ret = re.sub(r"\d+", add, "python = 997") print(ret) ret = re.sub(r"\d+", add, "python = 99") print(ret) 运行结果: python = 998 python = 100 split 根据匹配进行切割字符串,并返回一个列表 需求:切割字符串“info:xiaoZhang 33 shandong” #coding=utf-8 import re ret = re.split(r":| ","info:xiaoZhang 33 shandong") print(ret) 运行结果: ['info', 'xiaoZhang', '33', 'shandong']

    案例:爬取斗鱼上的图片

    import re import os import urllib.request import gevent from gevent import monkey monkey.patch_all() def down_img(img_name, img_link): # 可以将网址输入进去,然后下载 img = urllib.request.urlopen(img_link) img_content = img.read() with open(r"E:\python视频和代码\python代码\传智播客\就业班\day08\图片\%s" % img_name, "wb") as f: f.write(img_content) def main(): chaper_url = "https://www.douyu.com/g_yz" # 模拟浏览器,这样的话会对一些发爬虫的网站可以进行爬取 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} req = urllib.request.Request(url=chaper_url, headers=headers) html_code = urllib.request.urlopen(req).read().decode("utf-8") os.mkdir("图片") img_links = re.findall(r"https://rpic.douyucdn.cn.*?\.jpg", html_code) num = 0 for img_link in img_links: if num < len(img_links): gevent.joinall([gevent.spawn(down_img, "%d.jpg" % num, img_link)]) num += 1 else: break if __name__ == "__main__": main()
    最新回复(0)