Python进阶系列
Python进阶-网络编程-01
Python进阶-网络编程-02
Python进阶-网络编程-03
Python进阶-多任务编程-01
Python进阶-多任务编程-02
Python进阶-多任务编程-03
Python进阶-正则表达式
Python进阶-数据库编程-01
Python进阶-数据库编程-02
Python进阶-数据库编程-03
Python进阶-数据库编程-04
Python进阶-数据拷贝问题
Python进阶-模块导入问题
Python进阶-miniWeb框架

文章目录

  • 9.1. 正则表达式概述
  • 9.2. 测试工具介绍
  • 9.3. 匹配单个字符
  • 9.4. 匹配多个字符
  • 9.5. 匹配开头结尾
  • 9.6. re模块操作
  • 9.7. 匹配分组之"|"
  • 9.8. 匹配分组之"()"
  • 9.9. 匹配分组之"\"
  • 9.10. re模块的高级用法
  • 9.11. 贪婪和非贪婪
  • 9.12. r的作用
  • 9.13. 案例:《简单爬虫-批量获取电影下载链接》

9.1. 正则表达式概述

  • 正则表达式概念:规则表达式(一套特殊的规则)
  • 正则表达式的作用
    • 验证数据的有效性(查找)
    • 替换文本内容
    • 从字符串中提取子字符串(爬虫思想)

9.2. 测试工具介绍

  • regexBuddy :用来测试正则表达式的正确性
  • 使用:
    1. 选择 python3.6

    2. 点击test选项卡


9.3. 匹配单个字符


9.4. 匹配多个字符


9.5. 匹配开头结尾

  • ^表示匹配以后一个字符开头

    # 必须以小写字母、大写字母、下划线开头
    ^[a-zA-Z_]+\w
    

    用在[]内部,用于取反

    # 匹配不含有 h 和 e 的字符
    [^he]
    
  • $表示匹配以前一个字符结尾

    # 以数字结尾
    \d$
    

9.6. re模块操作

  • re模块的作用:python提供的用于正则操作的模块

  • re模块的使用步骤

    1. 导入模块

      import re
      
    2. 使用match()方法进行检测

      # 2、通过match方法,验证正则
      # re.match("正则表达式","要验证/检测的字符串")
      # match()方法如果匹配成功,返回match object对象
      # match()方法如果匹配失败,返回None正则字符串       要检测的内容
      result re.match("\w{4,20}@163\.coms","hello@163.com")
      
    3. 判断是否检测/匹配成功

      if result:print("匹配成功")
      else:print("匹配失败")
      
    4. 取出匹配的具体内容

      result.group()
      
  • 代码实例:

    # 1.导入模块
    import re# 2.使用match()方法进行检测
    result = re.match("\w{4,20}@163\.com$","hello@163.com")# 3.判断是否检测/匹配成功
    if result:print("匹配成功")
    else:print("匹配失败")# 4.取出匹配的具体内容
    print("匹配结果:",result.group())
    

9.7. 匹配分组之"|"

  • |的作用:或者关系,多个正则表达式满足其中一个即可

    # 引号内部不能出现非匹配的任何字符
    # 判断0-100之间的数字
    "^[0-9]?[0-9]$|^100$"
    
  • 代码实例:

    import reresult = re.match("^[0-9]?[0-9]$|^100$","13")if result:print("匹配成功")
    else:print("匹配失败")print("匹配结果:",result.group())
    

9.8. 匹配分组之"()"

  • 分组,整体匹配

    result = re.match("\w{4,20}@(163|126|qq|sina)\.com$","hello@qq.com")
    
  • 提取子字符串

    result = re.match("(\d{3,4})-(\d{7,8})","010-12345657")
    result.group()  # 获取匹配的结果
    result.group(1) # 获取第一个括号中的内容
    result.group(2) # 获取第二个括号中的内容
    
  • 代码实例:

    import reresult = re.match("(\d{3,4})-(\d{7,8})","010-12345657")if result:print("匹配成功")print("匹配的结果:",result.group())print("提取区号:",result.group(1))print("提取电话号码:",result.group(2))
    else:print("匹配失败")
    


9.9. 匹配分组之""

  • 引用分组

    \1 表示引用第一组

    result = re.match("<([a-zA-Z0-9]+)>.*</\\1>","<html>test</html>")result = re.match("<([a-zA-Z0-9]+)><([a-zA-Z0-9]+)>.*</\\2></\\1>","<html><h1>test</h1></html>")
    

    \\1表示引用第一组,\\是转义字符,转义后代表一个\

    \\2表示引用第二组

  • 代码实例:

    import reresult = re.match("<([a-zA-Z0-9]+)><([a-zA-Z0-9]+)>.*</\\2></\\1>","<html><h1>test</h1></html>")if result:print("匹配成功")
    else:print("匹配失败")print("匹配结果:",result.group())
    

  • 分组起别名

    • 起名:?P<name>给分组起别名,别名为name

    • 引用别名:(?P=name)引用别名为name的分组

    • 代码实例:

      import reresult = re.match("<(?P<name1>[a-zA-Z0-9]+)><(?P<name2>[a-zA-Z0-9]+)>.*</(?P=name2)></(?P=name1)>","<html><h1>test</h1></html>")if result:print("匹配成功")else:print("匹配失败")print("匹配结果:",result.group())
      

9.10. re模块的高级用法

  • search() 在需要匹配的字符串中搜索要匹配的内容

    # result=re.search("正则表达式","要搜索的内容")result=re.search("\d+","阅次数:9999")
    
    • 知道matchsearch的区别

      • match从需要检测.group的字符串的开头位置匹配,如果失败返回None
      • search从需要检测的字符串中搜索满足正则的内容,有则返回match object对象
  • findall() 在需要匹配的字符串中查找所有满足正则的内容,返回值是列表

    # result = re.findall("正则表达式","要搜索的内容s")result = re.findall("\d+","阅读次数:9999,转发次数:6666,评论次数:38")
    
  • sub()

    # sub("正则表达式","新的内容","要替换的字符串")# 将阅读次数,转发次数,评论次数都改为10000
    result = re.sub("\d+","10000","阅读次数:9999,转发次数:6666,评论次数:38")
    
  • split()

    # split("正则表达式”,"待拆分的字符串")# 以 ":" 或者 " " 拆分字符串
    result = re.split(":| ","info:hello@162.com zhangsan lisi")
    

9.11. 贪婪和非贪婪

  • 贪婪:满足正则的规则下,尽可能多的取内容

  • 非贪婪:满足正则的情况下,尽可能少的取内容

  • 把贪婪模式改为非贪婪模式,在 * ? + {} 后面加上 ?

  • 代码实例:

    import restr1 = """1131917_sma11,jpg" src="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917 small.jpg" style="display:inline;">"""result = re.search("src=\"(.*?)\"",str1)if result:print("匹配成功")print("地址:",result.group(1))
    else:print("匹配失败")print("匹配结果:",result.group())
    

9.12. r的作用

  • r的作用:让正则中的 \ 表示原生的含义,仅仅对\起作用

  • 代码实例:

    import reresult = re.match(r"<([a-zA-Z0-9]+)><([a-zA-Z0-9]+)>.*</\2></\1>","<html><h1>test</h1></html>")if result:print("匹配成功")
    else:print("匹配失败")print("匹配结果:",result.group())
    

9.13. 案例:《简单爬虫-批量获取电影下载链接》

  • 定义函数获取列表页的内容页地址 get_movie_links()

    1. 定义列表页的地址 https://www.ygdy8.net/html/gndy/dyzz/index.html

    2. 打开url地址,获取数据

    3. 解码获取到的数据

    4. 使用正则得到所有的影片内容页地址

      4.1 遍历,取出内容页地址4.2 拼接内容页地址4.3 打开内容页地址4.4 获取数据,并读取4.5 解码内容页数据,获取html内容页文本4.6 使用正则,获取下载地址的连接4.7 把影片信息和下载链接,保存到字典中
      

    ​ 4.8 返回字典

  • 主函数

    1. 调用 get_movie_links(),得到字典
    2. 遍历字典,显示下载内容
  • 代码实例:

    import urllib.request
    import redef main():films_dict = get_movie_links()# print(films_dict)# 把字典遍历输出for file_name,file_link in films_dict.items():print("%s | %s" % (file_name,file_link))def get_movie_links():"""获取列表页影片信息"""# 1.定义列表页的地址 https://www.ygdy8.net/html/gndy/dyzz/index.htmlfile_list_url = "https://www.ygdy8.net/html/gndy/dyzz/list_23_1.html"# 2.打开url地址,获取数据response_list = urllib.request.urlopen(file_list_url)# 通过read()读取网络资源数据response_list_data = response_list.read()# 3.解码获取到的数据response_list_text = response_list_data.decode("GBK")# 4.使用正则得到所有的影片内容页地址# print(response_list_text)# 4.1 使用findall() 根据正则查找所用影片对应的内容页地址# 返回的数据是个大列表,列表元素为元组,第一个元素是页面的url地址,第二个元素是影片名       称url_list = re.findall(r"<a href=\"(.*)\" class=\"ulink\">(.*) </a>",response_list_text)# 4.2 保存地址# 定义一个字典用于保存影片信息films_dict = {}i=1# 4.3 循环遍历 url_listfor content_url,file_name in url_list:content_url = "https://www.ygdy8.net" + content_urlprint("影片名称:%s,  内容页地址:%s" % (file_name,content_url))# 4.4 打开内容页地址response_content = urllib.request.urlopen(content_url)# 4.5 接收内容页数据# 4.6 读取网络资源response_content_data = response_content.read()# 4.7 解码得到内容页的文本内容response_content_text = response_content_data.decode("GBK")# 4.8 取出下载地址# print(response_content_text)result = re.search(r"magnet:\?xt=urn:btih:  (.*)fannounce",response_content_text)# print("下载地址%d:" % i,result.group())# 字典# {"xxx":"XXX地址"}films_dict[file_name] = result.group()print("已经获取%d条信息" % i)i += 1return films_dictif __name__ == '__main__':main()
    

Python进阶-正则表达式相关推荐

  1. Python自学路线图之Python进阶

    Python自学路线图的第二个阶段是Python进阶学习,自学完后需要掌握的Python技能: 1.自学Linux操作系统,熟练使用Linux操作系统: 自学网络编程,掌握网络编程相关技术, 能够实现 ...

  2. python进阶18正则表达式

    原创博客链接:python进阶18正则表达式 正则基础知识 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ^`:匹配行首 `$`:匹配结尾 `*`:( ...

  3. Python进阶之正则表达式

    1. 关于正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用 ...

  4. 【黑马-python进阶】---学习笔记(7)---线程、进程、协程、正则表达式

    4 多任务-线程 4.1 多任务介绍 目标 知道多任务概念 多任务和单任务程序的区别 1.多任务解析 操作系统可以同时运行多个任务,现在,多核CPU已经非常普及,但是,即使过去的单核CPU,也可以执行 ...

  5. 知识点 —— Python进阶-3

    Python进阶–3 单例模式 常用开发模式之一 用途 确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 A ...

  6. Python进阶--模块-re

    Python进阶–模块-re 1. 正则表达式 正则表达式,在字符串处理业务中经常会用到.这里对正则表达式的匹配规则不再赘述,我们仅介绍Python的re模块. 2. findall 2.1 方法解析 ...

  7. js转义字符 php 反转义6,js进阶正则表达式6转义字符(加\转义)(.符号)(|符号)...

    js进阶正则表达式6转义字符(加\转义)(.符号)(|符号) 一.总结 转义字符:{} () / $ # & * . ....... //3.特殊字符,都要加转义\ 点符号:var reg2= ...

  8. Python中正则表达式用法 重点格式以这个为准_首看_各种问题

    20210811 https://www.jb51.net/article/101258.htm 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: va ...

  9. Python进阶之递归函数的用法及其示例

    作者 | 程序员adny 责编 | 徐威龙 封图| CSDN│下载于视觉中国 出品 |  AI科技大本营(ID:rgznai100) 本篇文章主要介绍了Python进阶之递归函数的用法及其示例,现在分 ...

最新文章

  1. 新装 Win7 系统装完驱动精灵,一打开到检测界面就卡死——原因与解决方案
  2. Ubuntu12.04不能切换输入法
  3. Python中的线程、进程、协程以及区别
  4. 测试使用skywalking_skywalking初体验
  5. 倒计时 3 天!1024 程序员节全日程曝光,105 场深度演讲点燃数字经济新时代
  6. IDEA中启动tomcat
  7. 洛谷—— P1268 树的重量
  8. PIE SDK导出图片
  9. C语言通过枚举网卡,API接口可查看man 7 netdevice--获取接口IP地址
  10. OZ Report 오즈 리포트 개발
  11. LayaAir Geolocation 获取地理位置
  12. Win10(11)下Qt6.2编译Qtxlsx库
  13. (word、ppt、excel)​office怎么删除历史文档记录
  14. Subset sum problem
  15. oracle逗号隔开行转列_oralce逗号分割变多行-Oracle
  16. android声音大小锁定,固定音量锁(锁定音量)app
  17. 从首个IMO季军谈起 作者 : 付云皓
  18. 用了接口还有必要用抽象类吗?
  19. ubuntu 禁用笔记本触摸板
  20. 智能时代,三步让自己不再焦虑

热门文章

  1. html5图片按钮播放,html 播放 按钮
  2. 服装进销存管理软件哪个比较好用?
  3. VRChat与Anthos Capital携手合作,完成8,000万美元的D轮融资
  4. 搭建高可用oVirt(hosted engine)
  5. mac上metersphere本地开发环境搭建
  6. BCset BC set how entry is inserted to Database table when activated
  7. 在CentOS 7最小环境下安装Cinnamon桌面环境
  8. gitpc段提交失败schannel: next InitializeSecurityContext failed: Unknown error (0x80092013
  9. kotlin的必修之路
  10. stormzhang的自我介绍