Python网络爬虫学习笔记(三)正则表达式

2023-10-26

正则表达式

正则表达式是处理字符串的强大工具,它有自己特定的语法结构,有了它,实现字符串的检索、替换、匹配验证。

1 实例引入
正则表达式匹配 ,也就是用一定的规则将特定的文本提取出来 。
开源中国提供了正则表达式测试工具:
https://tool.oschina.net/regex/
例子:
Hello, my phone number is 010-86432100 and email is cqc@cuiqingcai.com, and my website is https://cuiqingcai.com.
在这里插入图片描述
在网页右侧选择“匹配 Email 地址”,就可以看到下方出现了文本中的email 。 如果选择“匹配网址 URL”,就可以看到下方出现了文本中的 URL。
在这里插入图片描述
Python 的 re 库提供了整个正则表达式的实现,利用这个库,可以在 Python 中使用正则表达式。

2. match()
match( )方法会尝试从字符串的起始位置匹配正则表达式,如果匹配,就返回匹配成功的结果;如果不匹配,就返回None 。
例子:

import re
content ='Hello 123 4567 World_This is a Regex Demo'
print(len(content))
result = re.match ('^Hello\s\d\d\d\s\d{4}\s\w{10}', content)#正则表达式匹配
print(result)
print(result. group())
print(result. span())

开头的 ^是匹配字符串的开头,也就是以 Hello 开头;
然后\s匹配空白字符,用来匹配目标字符串的空格;
\d 匹配数字,3 个\d 匹配 123 ;
1 个\s 匹配空格 ; 后面还有 4567 ,可以依然用4 个\d来匹配,后面跟{4}代表匹配前面的规则 4 次;
\w{10}匹配 10 个字母及下划线
最后并没有把目标字符串匹配完,不过这样依然可以进行匹配,只不过匹配结果短一点而已
运行结果:
在这里插入图片描述
结果是 SRE_Match 对象,这证明成功匹配
该对象有两个方法: group()方法可以输出匹配到的内容; span( )方法可以输出匹配的范围,结果是(0,25)

·匹配目标
可以使用()括号将想提取的子字符串括起来 。()实际上标记了一个子表达式的开始和结束位置,被标记的每个子表达式会依次对应每一个分组,调用 group()方法传入分组的索引即可获取提取的结果。例子:

import re
content ='Hello 1234567 World_This is a Regex Demo'
print(len(content))
result = re.match ('Hello\s(\d+)\sWorld', content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())

运行结果:
在这里插入图片描述
group(1)与 group ()有所不同,后者会输出完整的匹配结果,而前者会输出第一个被()包围的匹配结果

·通用匹配
有一个万能匹配可以用,那就是.*(点星)。 其中.(点)可以匹配任意字符(除换行符),*(星)代表匹配前面的字符无限次,所以它们组
合在一起就可以匹配任意字符了,有了它,就不用挨个字符地匹配了 。
例子:

import re
content = 'Hello 123 4567 World_This is a Regex Demo'
#将中间部分直接省略,全部用 . *来代替,最后加一个结尾字符串就好了
result = re.match('Hello.*Demo$', content)
print(result)
print(result.group())
print(result.span())

运行结果:
在这里插入图片描述
·贪婪与非贪婪
通用匹配:.*会匹配尽可能多的字符,是贪婪匹配

非贪婪匹配的写法是.*?,会尽可能匹配少的字符
例子:

import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('Hello.*(\d+).*Demo$', content)
print(result.group(1))

result = re.match('Hello.*?(\d+).*Demo$', content)
print(result.group(1))

运行结果:
在这里插入图片描述
注意:如果匹配的结果在字符串结尾,.*?就有可能匹配不到任何内容了,因为它会匹配尽可能少的字符,例子:

content ='http://weibo.com/comment/kEraCN'
result = re.match('http.*?comment/(.*?)',content)

·修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式 。
在这里插入图片描述
re.S 在网页匹配中经常用到 。 因为 HTML 节点经常会有换行,加上它,就可以匹配节点与节点之间的换行了 。
在网页匹配中,较为常用的有 re.S 和出re.I 。

· 转义匹配
当遇到用于正则匹配模式的特殊字符时,在前面加反斜线转义一下即可 。 例如: .就可以用\.来匹配

import re
content ='(百度)www.baidu.com'
result = re.match('\(百度\)www\.baidu\.com',content)
print(result)

3. search( )
search( )方法在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果 。 也就是说,正则表达式可以是字符串的一部分,如果搜索完了还没有找到,就返回 None。

4. findall( )
findall( )方法了会搜索整个字符串,然后返回匹配正则表达式的所有内容 。
如果只是获取第一个内容,可以用 search( )方法 。 当需要提取多个内容时,可以用于findall( )方法。

5. sub( )
如果想要把一串文本中的所有数字都去掉,如果只用字符串的 replace( )方法,那就太烦琐了,这时可以借助 sub( )方法。
例子:

import re
content ='54aKS4yrsoiRS4ixSL2g'
content = re.sub('\d+','', content)
print(content)

运行结果:
在这里插入图片描述
6. compile()
compile ()方法可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用 。
例子:

import re
contentl ='2016 12 15 12:00'
content2 ='2016-12-17 12:55'
content3 ='2016-12-22 13:21'
pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern,'',contentl)
result2 = re.sub(pattern,'',content2)
result3 = re.sub(pattern,'',content3)
print(result1,result2, result3)

运行结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python网络爬虫学习笔记(三)正则表达式 的相关文章

  • 理解Python中的元类和继承[重复]

    这个问题在这里已经有答案了 我对元类有一些困惑 具有继承性 class AttributeInitType object def init self kwargs for name value in kwargs items setattr
  • Pytorch 损失为 nan

    我正在尝试用 pytorch 编写我的第一个神经网络 不幸的是 当我想要得到损失时遇到了问题 出现以下错误信息 RuntimeError Function LogSoftmaxBackward0 returned nan values in
  • 将新形状传递给“np.reshape”

    Within numpy ndarray reshape https docs scipy org doc numpy reference generated numpy ndarray reshape html the shape参数是一
  • 可视化时间序列时标记特定日期

    我有一个包含几年数据的时间序列 例如 ts pd Series np random randn 1000 index pd date range 1 1 2000 periods 1000 ts ts cumsum ts plot 我还有两
  • 通过 pyodbc 连接到 Azure SQL 数据库

    我使用 pyodbc 连接到本地 SQL 数据库 该数据库工作正常 SQLSERVERLOCAL Driver SQL Server Native Client 11 0 Server localdb v11 0 integrated se
  • 使用 asyncore 读取网站

    我想异步阅读一个网站 据我所知 这是不可能的 urllib 现在我尝试使用普通套接字进行阅读 但是 HTTP 给我带来了麻烦 我遇到了各种时髦的编码 例如传输编码 分块 必须手动解析所有这些东西 我现在想编码 C 而不是 python 难道
  • VSCode Jupyter Notebook - 恢复缓存版本

    我正在使用在 Ubuntu 19 10 上运行的 VSCode v 1 48 0 创建一个 Jupyter Notebook VSCode 崩溃了 不幸的是我没有保存笔记本 当我重新启动时它是空的 我已经能够在 config Code Us
  • 导入错误:无法导入名称 urandom

    我正在构建一个新的 Linux 环境 并在 Python 上看到以下错误 python c import random Traceback most recent call last File
  • 设置区域设置和字符串模块

    这个简单的脚本 from locale import LC ALL setlocale print setlocale LC ALL from string import letters print letters 给我这个输出 tr TR
  • 在Python中随机化列表[重复]

    这个问题在这里已经有答案了 我想知道是否有一个好方法来 震动 Python 中的项目列表 例如 1 2 3 4 5 可能会被动摇 随机化 3 1 4 2 5 任何顺序都同样可能 from random import shuffle list
  • 遍历 globals() 字典

    我 尝试 使用globals 在我的程序中迭代所有全局变量 我就是这样做的 for k v in globals iteritems function k v 当然 这样做时 我只是创建了另外 2 个全局变量 k and v 所以我得到这个
  • 可变和不可变类变量如何初始化?

    运行下面的示例代码 class S i 0 a def init self self i 1 self a append 1 s1 S print s1 i s1 a s2 S print s2 i s2 a 输出将是 1 1 1 1 1
  • 为什么在 python 控制台中对 SparkSession.builder.getOrCreate() 的调用被视为命令行 Spark-submit?

    代替python console我正在尝试创建一个Spark Session 我没有使用pyspark以隔离依赖关系 为什么是spark submit命令行提示并生成错误 NOTE SPARK PREPEND CLASSES is set
  • 在 Python 中将 int 转换为 ASCII 并返回

    我正在为我的网站制作一个 URL 缩短器 我当前的计划 我愿意接受建议 是使用节点 ID 来生成缩短的 URL 因此 理论上 节点 26 可能是short com z 节点 1 可能是short com a 节点 52 可能是short c
  • 使用 pythons strftime 显示日期,例如“5 月 5 日”? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 日期顺序输出 https stackoverflow com questions 739241 python date ordinal output 在Python中 time strf
  • captureWarnings 设置为 True 不会捕获警告

    我想记录所有警告 我以为这样的设定captureWarnings to True应该可以解决问题 但事实并非如此 代码 import logging import warnings from logging handlers import
  • 带回溯的 Dijkstra 算法?

    In a 相关主题 https stackoverflow com questions 28333756 finding most efficient path between two nodes in an interval graph
  • 在Python中计算矩阵乘以其转置(AA^T)的最快方法

    在Python中将矩阵与其转置 AA T 相乘的最快方法是什么 我认为 NumPy SciPy 没有考虑使用例如时涉及的对称性 np dot or np matmul 得到的矩阵总是对称的 所以我可以想象有一个更快的解决方案 None
  • 继承自 NumPy 数组的类如何更改其自身的值?

    我有一个继承自 NumPy n 维数组的简单类 我想要该类的两个方法可以更改该类实例的数组值 其中一种方法应将类实例的数组设置为类实例的列表数据属性的值 另一种方法应将一些列表值附加到类实例的数组中 我不确定如何实现这一点 但我的尝试如下
  • 应用程序的外观 - Py2exe / wxPython

    所以我的问题是我的应用程序的外观和感觉 因为它看起来像一个旧的外观应用程序 它是一个 wxPython 应用程序 在 python 上它运行良好并且看起来不错 但是当我使用 py2exe 将其转换为 exe 时 外观很糟糕 现在我知道如果你

随机推荐

  • Egg简介

    Egg 前言 Egg js 为企业级框架和应用而生 基于Koa开发封装 性能优异 内置多进程管理 具有高扩展性 且提供了基于Egg定制上层框架的能力 帮助开发团队降低了开发维护成本 约定先于配置 相较于express更加灵活可配 Koa K
  • gateway网关的使用

    今天与大家分享gateway网关的使用 1 gateway简介 1 1 是什么 SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关 目标是替代 Zuul 在Spring Cloud 2 0以上版本中 没
  • 动手实验:使用 jstat 摸清线上系统的JVM运行状况

    添加VX ruyuan0220 回复 CSDN 领取更多精品学习资料 目录 功能强大的jstat jstat gc PID 其他的jstat命令 到底该如何使用jstat工具 新生代对象增长的速率 Young GC的触发频率和每次耗时 每次
  • 关于\n,\\\n,\\\\\n在java中的split()正则中的理解

    关于 n n n在java中的split 正则中的理解 在做一个题的时候 要把一串字符串dir n tsubdir1 n tsubdir2 n t tfile ext按 n分割 粘贴到idea idea识别自动转义成 也是一个坑 dir n
  • C/C++中调用SQLITE3

    C C 中调用SQLITE3 2011 08 04 17 31 09 分类 LINUX C C 中调用SQLITE3的基本步骤 Sqlite 是一个面向嵌入式系统的数据库 编译完成只有200K 同时支持2T的数据记录 对于嵌入式设备是一个很
  • 操作系统与Linux篇之卷首语

    2023年7月23日 周日晚上 通过纯粹地看操作系统相关书籍来学习操作系统实在是太枯燥和抽象了 我看不到实现的细节 我看不到实际的操作系统代码 这让我学得很难受 所以我决定结合开源的Linux来学习操作系统 我发现这样做不仅学起来更加有趣
  • Expecting property name enclosed in double quotes解决篇

    作者 关注了 Github Github 掘金 进去看看 爱好 Americano More Ice QQ学习交流群 new 811792998 问题 json decoder JSONDecodeError Expecting prope
  • spring boot: 输出json

    spring boot 输出json 注意 关闭java的Terminate后 在重新启动 否则报错 app java启动配置 package com muyang boot1 import org springframework boot
  • curl 命令的学习笔记

    curl 命令的学习笔记 curl 官网 https curl haxx se curl 全称 CommmandLine URL 或 CommandLine Uniform Resource Locator 是用于从服务器传输传输数据或向服
  • 【ARM】Linux内核驱动之定时器

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https gitee com stylle linux code 点赞 收藏 再看 养成习惯 订阅的粉丝可通过PC端文末加我微信 可对文章的内容进
  • set -e -x 等等的作用

    set指令能设置所使用shell的执行方式 可依照不同的需求来做设置 a 标示已修改的变量 以供输出至环境变量 b 使被中止的后台程序立刻回报执行状态 C 转向所产生的文件无法覆盖已存在的文件 d Shell预设会用杂凑表记忆使用过的指令
  • VUE 输入框实现光标插入,设置光标位置并删除光标内容

    最近做项目遇到这样一个需求 可以往输入框指定光标出插入内容 并且当删除插入的内容时会先将插入的内容进行光标选中给用户进行提示 当再次删除时才删除内容 而这个需求的核心就在 setSelectionRange 设置光标位置 这个dom api
  • Docker之Nacos的持久化和集群部署

    注1 小插曲 由于虚拟机分配的内存为1G 开到第四个容器时 由于内存不够导致容器启动失败 重新设置4G内存后启动成功 ok 正式进入主题 一 Docker mysql 5 7的持久化存储及远程连接 1 拉取相关镜像 目前网络模式为 brid
  • Flutter中 解决自定义阿里妈妈图标一直显示不出来的问题

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 前言 Flutter中 自定义图标一直显示出来的问题 这里引用的是阿里妈妈图标 问题解决 位置一定要对应好
  • 解决小程序报错getLocation:fail the api need to be declared in the requiredPrivateInfos field in app.json

    报错 1 uniapp项目 在manifest json中打开源码视图 小程序特有相关 mp weixin appid 你的开发者id setting urlCheck true es6 true postcss true minified
  • 【Scala入门】scala基础语法:类和对象,变量和常量

    上一篇请移步 Scala入门 Scala下载及安装 Windows 以及Idea创建第一个scala项目 水w的博客 CSDN博客 目录 一 Scala 二 Scala基础语法 2 1 注释与标识符规范 2 2 变量与常量 案例 变量声明和
  • 摩尔定律到摩尔第二定律

    摩尔定律相信大家都不陌生 由英特尔创始人之一戈登 摩尔提出来的 其内容为 当价格不变时 集成电路上可容纳的元器件的数目 约每隔两年便会增加一倍 而普遍的说法是约每隔18个月便会增加一倍 各种说法总结起来就是 1 集成电路芯片上所集成的电路的
  • 【docker】/var/lib/docker/overlay2/ 占用磁盘问题 最终解决方案

    找IT 挂载了新磁盘 比如 data2 100G 在docker配置文件中 加上这个 systemctl daemon reload 重启docker服务即可 会导致此服务器上的所有docker 容器丢失 需要重新部署 还会导致一个问题 d
  • Hibernate参数校验报错:No validator'javax.validation.constraints.Size' validating type 'java.lang.Integer'.

    javax validation UnexpectedTypeException HV000030 No validator could be found for constraint javax validation constraint
  • Python网络爬虫学习笔记(三)正则表达式

    正则表达式 正则表达式是处理字符串的强大工具 它有自己特定的语法结构 有了它 实现字符串的检索 替换 匹配验证 1 实例引入 正则表达式匹配 也就是用一定的规则将特定的文本提取出来 开源中国提供了正则表达式测试工具 https tool o