正则表达式

最近学校布置了一个关于python爬虫的期末作业,而我之前对python爬虫一直都比较感兴趣但是没有系统的学过,就想借此机会开个新坑来系统学习和应用python爬虫,那我们开始吧

正则表达式在爬虫中扮演很重要的角色,几乎所有有关字符串的操作都可以使用正则表达式来完成,其可以帮助我们高效地从网页获取提取的信息.在正式接触爬虫之前是非常有必要的学习正则表达式,所有关于正则表达式的操作都使用 python 标准库中的 re 模块

元字符

元字符是正则表达式中具有特殊含义的字符,其用于构建更复杂的模式匹配规则

元字符 匹配内容 实例
. 匹配除换行符以外的任意单个字符 a.b 可以匹配 aXb, a1b, a b
\w 匹配所有普通字符(数字、字母或下划线)→[a-z A-Z 0-9 _] \w{3}可以匹配abc,a1b,12_
\s 匹配任意的空白符,包括空格,制表符,换页符等等 \s{3}可以匹配三个连续的空格
\d 匹配数字→[0-9] 如\d{3}可以匹配123,456 等等
\n 匹配一个换行符
\t 匹配一个制表符
\b 匹配一个单词的结尾 \bcat\b匹配cat
^ 匹配字符串的开始位置,多行模式下匹配每一行的开始 ^abc只能匹配abc开头的字符串
$ 匹配字符串的结尾位置,多行模式下匹配每一行的结束 abc$只能匹配以abc结尾的字符串
\W 匹配非字母或数字或下划线→[^a-z A-Z 0-9 _] \W{3}可以匹配!!!,***等等
\D 匹配非数字→[^0-9] \D{3}可以匹配abc,xyz等等
\S 匹配非空白符 \S{3}可以匹配abc,123等等
或运算符,匹配左边或右边的表达式
( ) 正则表达式分组所用符号,匹配括号内的表达式,表示一个组。 (ab)+ 可以匹配ab,ab,abab等等
[...] 匹配字符组中的字符 [abc]可以匹配a,bc
[^...] (否定字符集) 匹配除了字符组中字符的所有字符 [^abc]可以匹配除a,b,c的所有字符
* 匹配前面的子表达式0次或多次 ab*c可以匹配ac,abc,abbc等等
+ 匹配前面的子表达式1次或多次 ab+c 可以匹配abc,abbc,但不能直接匹配ac
? 匹配前面的子表达式0次或1次 ab?c可以匹配ac,abc,不能匹配abbc
匹配前面的子表达式恰好 n 次 a{3}只能匹配aaa
匹配前面的子表达式至少 n 次 a{2,}可以匹配aa,aaa,aaaa等等
匹配前面的子表达式至少 n 次,最多 m 次 a{2,4}可以匹配aa,aaa,aaaa,但不能匹配aaaaa
\ 转义字符,用于匹配特殊字符 \.匹配字面上的.

贪婪模式与非贪婪模式

在正则表达式中,贪婪模式与非贪婪模式是两种不同的匹配策略,都用于控制量词(*,+,?,{})的行为

贪婪模式

  • 默认情况下,大多数的量词都是贪婪的,贪婪模式会尽可能的多匹配字符,直到无法匹配

  • 常见的贪婪量词:

    • *:匹配前面的子表达式零次或多次
    • +:匹配前面的子表达式一次或多次
    • ?:匹配前面的子表达式零次或一次
    • {n}:匹配前面的子表达式恰好 n 次
    • {n,}:匹配前面的子表达式至少 n 次
    • {n,m}:匹配前面的子表达式至少 n 次,最多 m 次
  • eg:假设一个字符串”abcdadcde”,使用贪婪模式匹配a.*e

    import re
    
    text = "abcdadcde"
    pattern = re.compile(r'a.*e') match = pattern.search(text)
    print(match.group()) # 输出abcdadcde
    • 在这个例子中,.* 会尽可能多地去匹配字符,直到最后一个e

非贪婪模式

  • 相比与贪婪模式,非贪婪模式会尽可能地少的去匹配字符,直到条件满足为止,非贪婪模式通过在量词后加上?来启用
  • 常见的非贪婪量词
    • *?:匹配前面的子表达式零次或多次,但尽可能少地匹配。
    • +?:匹配前面的子表达式一次或多次,但尽可能少地匹配。
    • ??:匹配前面的子表达式零次或一次,但尽可能少地匹配。
    • {n}?:匹配前面的子表达式恰好 n 次,但尽可能少地匹配。
    • {n,}?:匹配前面的子表达式至少 n 次,但尽可能少地匹配。
    • {n,m}?:匹配前面的子表达式至少 n 次,最多 m 次,但尽可能少地匹配

eg:假设先有一个字符串”abcdeabcde”,其匹配模式修改为a.*?e

import re

text = "abcdeabcde"
pattern = re.compile(r'a.*?e') match = pattern.search(text)
print(match.group()) # 输出abcde

python爬虫 正则表达式详解的更多相关文章

  1. python爬虫知识点详解

    python爬虫知识点总结(一)库的安装 python爬虫知识点总结(二)爬虫的基本原理 python爬虫知识点总结(三)urllib库详解 python爬虫知识点总结(四)Requests库的基本使 ...

  2. Python:正则表达式详解

    正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能 ...

  3. Python爬虫 | Selenium详解

    一.简介 网页三元素: html负责内容: css负责样式: JavaScript负责动作; 从数据的角度考虑,网页上呈现出来的数据的来源: html文件 ajax接口 javascript加载 如果 ...

  4. Python爬虫实战详解:爬取图片之家

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 如何使用python去实现一个爬虫? 模拟浏览器请求并获取网站数据在原始数据 ...

  5. Linux文本处理三剑客之grep及正则表达式详解

    Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...

  6. Java 正则表达式详解_正则表达式

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  7. Python开发技术详解PDF

    Python开发技术详解(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1F5J9mFfHKgwhkC5KuPd0Pw 提取码:xxy3 复制这段内容后打开百度网盘手 ...

  8. Django url配置 正则表达式详解 分组命名匹配 命名URL 别名 和URL反向解析 命名空间模式

    Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11版本 ...

  9. python协程详解,gevent asyncio

    python协程详解,gevent asyncio 新建模板小书匠 #协程的概念 #模块操作协程 # gevent 扩展模块 # asyncio 内置模块 # 基础的语法 1.生成器实现切换 [1] ...

  10. Python基础知识详解 从入门到精通(七)类与对象

    本篇主要是介绍python,内容可先看目录其他基础知识详解,欢迎查看本人的其他文章Python基础知识详解 从入门到精通(一)介绍Python基础知识详解 从入门到精通(二)基础Python基础知识详 ...

随机推荐

  1. C#自定义控件—文本显示、文本设值

    C#用户控件之文本显示.设定组件 如何绘制一个便捷的文本显示组件.文本设值组件(TextShow,TextSet)? 绘制此控件的目的就是方便一键搞定标签显示(可自定义方法显示文本颜色等),方便自定义 ...

  2. box-sizing属性的理解

    使用原因 盒模型布局中padding与border也是具有尺寸的,为避免其对页面布局产生影响,可使用box-sizing: border-box;属性设置盒模型,此时便可只用设置元素宽高即可. 属性详 ...

  3. XAMPP Windows PHP-CGI 代码执行漏洞(CVE-2024-4577) | Goby漏洞预警

    漏洞描述: PHP是一种在服务器端执行的脚本语言,在 PHP 的 8.3.8 版本之前存在命令执行漏洞,由于 Windows 的 "Best-Fit Mapping" 特性,在处理 ...

  4. JS处理html的编码(encode)与解码(decode)

    一.用浏览器内部转换器实现转换 代码: var HtmlUtil = { // 1.用浏览器内部转换器实现html编码 htmlEncode: function(html) { // 创建一个元素容器 ...

  5. 借助 Flutter 顺畅地开发多平台应用

    Flutter 已于近期发布了 Flutter 2,Flutter 和 Dart 的产品总监 Tim Sneath 在 2021 年三月上旬举办的 Flutter Engage 活动中表示,Flutt ...

  6. c++线程--快速上手

    线程创建 头文件#include thread 是在 C++11 标准中引入的. C++11 标准引入了对多线程编程的标准化支持,其中包括了线程的创建.管理和同步机制. 头文件提供了基本的线程支持库, ...

  7. Android Qcom USB Driver学习(十三)

    DPM Device Policy Manager deals with the USB Power Delivery resources used by one or more ports on t ...

  8. 数据库周刊54丨2020 年度报告:PingCAP、腾讯云数据库、人大金仓、GoldenDB ;CPU 100% SQL优化案例;Mysql内存溢出处理;sql server PK openGauss;Oracle 巡检说明书;避免删库跑路黑天鹅……

    热门资讯 1.PingCAP 2020 年度报告|相信开放的力量 [摘要]本文为PingCAP 2020年度报告.盘点了PingCAP里程碑大事件:完成D轮2.7亿美元融资,创造全球数据库历史新的里程 ...

  9. 在 Vue 实例中编写生命周期hook 或者其它 option/propertie 时,为什么不适用箭头函数 ?

    首先,箭头函数没有自己的 this 环境变量 会沿用作用域使用父级this : 由Vue 管理的函数 ,如果写成箭头函数 this 就不在是 Vue 实例 了 :

  10. C#查漏补缺----值类型与引用类型,值类型一定分配在栈上吗?

    前言 环境:.NET 8.0 系统:Windows11 参考资料:<CLR via C#>, <.Net Core底层入门>,<.NET 内存管理宝典> 栈空间与堆 ...