Python爬虫(五)—正则表达式 re 的深入学习

python爬虫re模块(抓取信息) python爬虫1 《1》什么是爬虫网络爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人), 是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。 《2》爬虫的基本原理: 我们把互联网比喻为一张大网,网络爬虫我们想象为网上的蜘蛛,网页与网页之间的连接我们理解为节点,爬虫就相当于是访问网页,获取网页的信息,又通过节点可以爬取另一个网站,然后不停的通过一个个节点即访问一个个网页,这样网站的数据就可... 阅读详情

前言

以下关于正则表达式 re 学习记录,强烈推荐深入了解的查看官方文档。

re:https://docs.python.org/zh-cn/3/library/re.html

本文借鉴官方文档及博文:https://www.cnblogs.com/zhaof/p/6925674.html

正则表达式

  • 介绍
    正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子。

    • 大小写敏感
    • 使用反斜杠(’\’)来表示特殊字符,或者把特殊字符转义成普通字符。
    • 带有 ‘r’ 前缀的字符串字面值中,反斜杠不必做任何特殊处理。 最简单的表达式,也要推荐原始字符串:r’regex’。
    • 正则表达式可以拼接; 如果 A 和 B 都是正则表达式, 那么 AB 也是正则表达式。 通常, 如果字符串 p 匹配 A 并且另一个字符串 q 匹配 B, 那么 pq 可以匹配 AB。
    • 重复修饰符 (, +, ?, {m,n}, 等) 不能直接嵌套。这样避免了非贪婪后缀 ? 修饰符,和其他实现中的修饰符产生的多义性。要应用一个内层重复嵌套,可以使用括号。 比如,表达式 (?:a{6}) 匹配6个 ‘a’ 字符重复任意次数。
    • 绝大部分正则表达式操作都提供为模块函数和方法,在 编译正则表达式. 这些函数是一个捷径,不需要先编译一个正则对象,但是损失了一些优化参数。
  • 特殊字符

\w      匹配字母数字及下划线
\W      匹配f非字母数字下划线
\s      匹配任意空白字符,等价于[\t\n\r\f]
\S      匹配任意非空字符
\d      匹配任意数字
\D      匹配任意非数字
\A      匹配字符串开始
\Z      匹配字符串结束,如果存在换行,只匹配换行前的结束字符串
\z      匹配字符串结束
\G      匹配最后匹配完成的位置
\n      匹配一个换行符
\t      匹配一个制表符
^       匹配字符串的开头
$       匹配字符串的末尾
.       匹配任意字符,除了换行符,re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
[....]  用来表示一组字符,单独列出:[amk]匹配a,m或k
[^...]  不在[]中的字符:[^abc]匹配除了a,b,c之外的字符
*       匹配0个或多个的表达式
+       匹配1个或者多个的表达式
?       匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{n}     精确匹配n前面的表示
{m,m}   匹配n到m次由前面的正则表达式定义片段,贪婪模式
a|b     匹配a或者b
()      匹配括号内的表达式,也表示一个组
  • 控制匹配的模式
修饰符描述
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

re.compile(pattern, flags=0)

将正则表达式的样式编译为一个 正则表达式对象 (正则对象),可以用于匹配,通过这个对象的方法 match(), search() 以及其他如下描述。

这个表达式的行为可以通过指定 标记 的值来改变。值可以是以下任意变量,可以通过位的OR操作来结合( | 操作符)。

prog = re.compile(pattern)
result = prog.match(string)

等价于

result = re.match(pattern, string)

如果需要多次使用这个正则表达式的话,使用 re.compile() 和保存这个正则对象以便复用,可以让程序更加高效。

re.match(pattern, string, flags=0)

如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的 匹配对象 。 如果没有匹配,就返回 None。
尽量使用泛匹配,使用括号得到匹配目标,尽量使用非贪婪模式,有换行符就用re.S
re.match是从字符串的起始位置匹配一个模式

  • 常规的匹配
    • result.group()获取匹配的结果
    • result.span()获去匹配字符串的长度范围
import re

content = "hello 123 4567 World_This is a regex Demo"
result = re.match('^hello\s\d\d\d\s\d{4}\s\w{10}.*Demo$',content)
print(result)
print(result.group())
print(result.span())
"""
<_sre.SRE_Match object; span=(0, 41), match='hello 123 4567 World_This is a regex Demo'>
hello 123 4567 World_This is a regex Demo
(0, 41)
"""
  • 泛匹配
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())
  • 匹配目标
    为了匹配字符串中具体的目标,则需要通过()括起来。
    通过re.group()获得结果后,如果正则表达式中有括号,则re.group(1)获取的就是第一个括号中匹配的结果
import re

content = "extra things hello 123455 world_this is a Re Extra things"
result = re.search("hello.*?(\d+).*?Re",content)
print(result)
print(result.group())
print(result.group(1))
"""
<_sre.SRE_Match object; span=(13, 44), match='hello 123455 world_this is a Re'>
hello 123455 world_this is a Re
123455
"""
  • 贪婪匹配

import re

content = "hello 1234567 World_This is a regex Demo"
result = re.match('^hello.*(\d+).*Demo',content)
print(result)
print(result.group(1))  # 7

结果中可以看出只匹配到了7,并没有匹配到1234567,出现这种情况的原因是前面的.* 给匹配掉了, .*在这里会尽可能的匹配多的内容,也就是我们所说的贪婪匹配,

如果我们想要匹配到1234567则需要将正则表达式改为:
result= re.match(’^he.*?(\d+).*Demo’,content)
这样结果就可以匹配到1234567

  • 匹配模式的使用
import re

content = """hello 123456 world_this
my name is luozheng
"""

result = re.match('^he.*?(\d+).*?luozheng$',content,re.S)
print(result.group())
print(result.group(1))
"""
hello 123456 world_this
my name is luozheng
123456
"""

re.search(pattern, string, flags=0)

扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象。如果没有匹配,就返回一个 None。
为了匹配方便,我们会更多的用search,不用match,match必须匹配头部,所以很多时候不是特别方便
关于常规的匹配、泛匹配、匹配目标、贪婪匹配、匹配模式的使用 同样适用。

import re

content = "extra things hello 123455 world_this is a Re Extra things"

result = re.search("hello.*?(\d+).*?Re",content)
print(result.group())
print(result.group(1))
"""
hello 123455 world_this is a Re
123455
"""

re.findall(pattern, string, flags=0)

对 string 返回一个不重复的 pattern 的匹配列表, string 从左到右进行扫描,匹配按找到的顺序返回。如果样式里存在一到多个组,就返回一个组合列表;就是一个元组的列表(如果样式里有超过一个组合的话)。空匹配也会包含在结果里。

在 3.7 版更改: 非空匹配现在可以在前一个空匹配之后出现了。
import re

html = '''<div id="songs-list">
    <h2 class="title">经典老歌</h2>
    <p class="introduction">
        经典老歌列表
    </p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君">但愿人长久</a>
        </li>
    </ul>
</div>'''

results = re.findall('<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>',html,re.S)
print(results)
for result in results:
    print(result[1])
"""
一路上有你
沧海一声笑
往事随风
光辉岁月
记事本
但愿人长久
"""

注意点

  • \s*? 这种用法其实就是为了解决有的有换行,有的没有换行的问题
  • (<a.*?>)? 这种用法是因为html中有的有a标签,有的没有的,?表示匹配一个或0个,正好可以用于匹配
  • 匹配对象总是有一个布尔值 True。如果没有匹配的话 match() 和 search() 返回 None 所以你可以简单的用 if 语句来判断是否匹配
match = re.search(pattern, string)
if match:
    process(match)
  • 正则表达式对象 (正则对象),同样支持search、 match、findall、split、sub等这些方法。
pattern = re.compile("d")
pattern.search("dog")     # Match at index 0 :<re.Match object; span=(0, 1), match='d'>

pattern.search("dog", 1)  # No match; search doesn't include the "d"

其他函数

  • re.split(pattern, string, maxsplit=0, flags=0)
    用 pattern 分开 string 。 如果在 pattern 中捕获到括号,那么所有的组里的文字也会包含在列表里。如果 maxsplit 非零, 最多进行 maxsplit 次分隔, 剩下的字符全部返回到列表的最后一个元素。
import re

s1 = re.split(r'\W+', 'Words, words, words.')
s2 = re.split(r'(\W+)', 'Words, words, words.')
s3 = re.split(r'\W+', 'Words, words, words.', 1)
s4 = re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)

print(s1)
print(s2)
print(s3)
print(s4)
"""
['Words', 'words', 'words', '']
['Words', ', ', 'words', ', ', 'words', '.', '']
['Words', 'words, words.']
['0', '3', '9']
"""
  • re.sub(pattern, repl, string, count=0, flags=0)
    re.sub(正则表达式,替换成的字符串,原字符串)
    例如:
    content = re.sub(’\d+’,’’,content)
    会将所有数字删除。
  • re.purge()
    清除正则表达式缓存

个人博客:Loak 正 - 关注人工智能及互联网的个人博客
文章地址:Python爬虫(五)—正则表达式 re 的深入学习

Python网络爬虫和正则表达式学习总结 阅读目录 1.利用urllib2对指定的URL抓取网页内容 2. 使用正则表达式过滤抓取到的网页信息 2.1 正则表达式介绍 2.2 Python的re模块 2.3 Python正则表达式汇总   以前在学校做科研都是直接利用网上共享的一些数据,就像我们经常说的dataset、beachmark等等。但是,对于实际的工业需求来说,爬取网络的数据是必须的并且是首要的。最近在国内一家互联网公司实习,我的mentor交给我的第一件事就是去网络上爬取数据,并对爬取的数据进行相关的分析和解析。 很多人学习 阅读详情

相关推荐

网络爬虫:Re库与正则表达式

介绍了正则表达式的相关概念,以及python中的re库对于正则表达式的应用

Jingmin Wei's Blog 1238

8.网络爬虫—正则表达式RE实战

正则表达式(Regular Expression) 正则表达式(Regular Expression)是一种用于匹配字符串的工具,它可以根据特定的规则来匹配字符串。正则表达式通常由一组字符和字符集合组成,其中字符集合定义了匹配的字符类型和位置。 re.I 🧾 🧾 语法: re.IGNORECASE 或简写为 re.I 🧾 🧾 含义: 进行忽略大小写匹配。 在Python中,可以使用re模块中的re.IGNORECASE标志来实现正则表达式的忽略大小写。例如,如果要匹配字符串apple,可以使用

weixin_50804299的博客 7619

北理工嵩天Python网络爬虫与信息提取MOOC 测验3: Python网络爬虫之实战 (第3周)

Python网络爬虫与信息提取MOOC 测验3: Python网络爬虫之实战 (第3周) 1、以下不是正则表达式优势的选项是:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬ A、一行胜千言 B、实现自动化脚本 C、特征表达 D、简洁 正确答案...

Teaphon 3032

7.网络爬虫—正则表达式详讲

Python 正则表达式 Python 正则表达式是一种用于匹配、搜索、替换文本中模式的工具。它使用特定的语法来描述一些规则,这些规则可以用于匹配文本中的某些模式。通过使用正则表达式,可以快速地搜索和处理大量的文本数据,从而节省时间和精力。 在 Python 中,正则表达式可以通过 re 模块进行操作。 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式 re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根据一个模式字

weixin_50804299的博客 6283

[Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家。第四篇文章将开启网络爬虫之旅,首先介绍基础知识及正则表达式的爬虫,希望对您有所帮助,文章中不足之处也请海涵。

杨秀璋的专栏 2万+

银河麒麟V10离线安装VLC播放器:依赖处理与3.0.9.2版本实操指南

在国产化操作系统日益普及的背景下,软件安装方式成为政企内网用户关注的重点。离线安装作为一种不依赖公网源的部署手段,常用于解决内网环境下的软件获取问题。其核心在于理解Linux包管理机制,如dpkg与apt对依赖关系的处理逻辑。掌握这一原理,不仅能应对多媒体软件的部署,也能提升系统维护效率。VLC作为跨平台多媒体播放器,凭借强大的解码能力与协议支持,广泛应用于本地视频播放、RTSP拉流及监控大屏等场景。本文从离线安装的通用概念出发,结合银河麒麟V10桌面版的实际环境,详细梳理了VLC 3.0.9.2离线包的获

weixin_32247165的博客 376

Python网络爬虫数据采集实战:Requests和Re库

​熟悉爬虫的基本概念之后,我们可以直接开始爬虫实战的学习,先从Python的requests库即re库入手,可以迅速“get”到python爬虫的思想以及流程,并且通过这两个库就可以建立一个完整的爬虫系统。 目录 一、requests库 1.简介 2.入门测试 3.主要方法 二、re库 1.简介 2.入门测试 3....

大数据之眸 9808

51单片机也能玩转GC9A01彩屏?超详细移植指南与性能优化技巧

本文详细介绍了如何在51单片机上高效驱动GC9A01彩屏,包括硬件连接优化、SPI模拟驱动、内存管理策略及高级刷新技术。通过分段缓冲、颜色压缩和差异化刷新等技巧,显著提升显示性能,使51单片机也能流畅运行240x240分辨率的彩色TFT屏幕。

hp777的博客 190

Python网络爬虫

Python以简单高效著称,在日常工作中用处非常多,处理文件、群发网络请求、爬网页信息等等,现把Python语法总结如下,供后续方便复习查阅。 文章目录一、变量 一、变量

Captain_RB的博客 5704

【第六届起重机创意大赛国一作品——资料分享】

文章目录前言一、比赛内容分析二、确定方案与作品模型1.方案简图2.作品模型三、电控部分控制思路单片机选择与资源分配拓展板的设计接线与走线代码分享总结

qq_19308801的博客 7783

MATLAB 论文复现——基于虚拟储能的电动汽车充放电调度策略及激励评价

文章基于虚拟储能聚合体仿真模型优化电动汽车充放电调度,并采用复合权重评价电动汽车的充电激励。根据电动汽车灵活性和系统稳定性衡量其贡献大小,并通过模糊推理系统模拟用户的充电意愿,实现对电动汽车充电的引导和优化。[1]陈朔,胡昊,方慧敏,等.基于虚拟储能的电动汽车充放电调度策略及激励评价[J/OL].系统仿真学报,1-12[2024-07-24].https://doi.org/10.16182/j.issn1004731x.joss.23-1316.基于虚拟储能的电动汽车充放电调度策略及激励评价。

sjr1478的博客 366

【Python网络爬虫笔记】7-网络爬虫的搜索工具re模块

在 Python 中,re模块提供了对正则表达式操作的支持,包括等功能,使得在网络爬虫中方便地运用正则表达式来处理抓取到的数据。

zi__you的博客 1388

通信系统原理[郭宇春]——模拟调制系统——课后习题答案

通信系统原理[郭宇春]——第三章课后习题答案,出错望指正!

尧呱呱的博客 3844

Python 网络爬虫的常用库汇总(建议收藏)

Python 在编写网络爬虫常常用到的一些库。Python爬虫网络库主要包括:urllib、requests、lxml、fake-useragent、bs4(BeautifulSoup)、grab、pycurl、urllib3、httplib2、RoboBrowser 、MechanicalSoup、mechanize、socket、Unirest for Python、hyper、PySocks、treq、aiohttp等。爬虫框架Web 框架库Re库介绍:正则表达式的表示类型:raw string类型(

大模型研究中心 1万+

【各种轮子2】基于Icepak的PCB散热仿真比较

随着电子产品的集成度越来越高,PCB板的尺寸越来越小,板级芯片散热的问题越来越成为电子工程师的一个重要挑战。对于板级芯片散热,主要依靠工程师对PCB自身的设计进行优化,同时要兼顾系统的尺寸和成本。本文分别从芯片角度和PCB角度进行建模,芯片模型选用QFN封装,PCB模型采用走线导入模型,探讨了芯片结构,PCB铜厚,PCB叠层厚度对芯片散热的影响。

3671

【现代控制理论期末考点】

现代控制理论期末考点,适用于 SEU Automation

【人工智障 | 计算鸡视觉 | 机器孩】 1445

python网页爬虫之re库及正则表达式(含实例)

python网页爬虫之re库及正则表达式 正则表达式 regular expression 简称“RE” 正则表达式是用来简洁表达一组字符串的表达式。 ‘PY’ ‘PYY’ ‘PYYYYY…’ 正则表达式: PY+ ‘PY’开头,后续存在不多于10个字符,后续字符不能是‘P’或‘Y’ ‘PYABC’ √ ‘PYKXYZ’ × 正则表达式: PY[^PY]{0,10} 正则表达式: 1)通用的字符串...

Slime 4756

深度学习图神经网络 (GNN) —— 处理图结构数据(六十九)

本文系统介绍了图神经网络(GNN)的核心概念、主流模型及其应用。主要内容包括: GNN基础:阐述了图结构数据的特性(节点数不定、连接不规则),以及GNN相比CNN/RNN的优势在于处理非欧式空间的图数据。 核心机制:重点讲解了消息传递框架(MPNN),通过聚合邻居信息迭代更新节点表示,并分析了GCN的归一化邻接矩阵计算和GAT的注意力权重机制。 典型模型: GCN:基于归一化邻接矩阵的特征传播 GAT:引入注意力机制区分邻居重要性 GraphSAGE:通过采样解决大图扩展性问题 GIN:理论表达能力最强的图

hello.reader 301

python简单实现网络爬虫

在这一篇博客中,我会用python来实现一个简单的网络爬虫。简单的爬取一下一些音乐网站、小说网站的标题、关键字还有摘要!所以这个爬虫并不是万能爬,只针对符合特定规则的网站使用。(只使用于爬标题、关键字和摘要的,所以只能爬在head标签中这三个信息都有的且meta标签中name参数在本文信息前面的网站。)希望大家看了这篇博客,能对大家学习爬虫有些帮助! 要用到的知识

沉在海里的鱼的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Datawhale零基础网络爬虫学习笔记第二章数据解析正则化】【其一】【re】

网络爬虫数据解析与正则表达式学习笔记 本文介绍了网络爬虫中数据解析的基本概念和方法,重点讲解了正则表达式(re)的使用。主要内容包括: 数据解析的两种主要方法:正则表达式和网页结构解析工具(如xpath、BeautifulSoup等) 正则表达式的基础语法规则,包括字符匹配、量化符号、转义字符等 Python中re模块的常用函数(match、search、findall等)及使用方法 通过豆瓣TOP250电影信息抓取案例,展示了正则表达式在爬虫项目中的应用 笔记提供详细的代码示例,帮初学者掌握正则表达式。

m0_53118662的博客 2035

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

学习Python的第三天之网络爬虫

30岁程序员学习Python的第三天之网络爬虫——正则表达式。

注释写满人生 839

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Python网络爬虫-re正则匹配数据

re是一种强大的文本处理工具,它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为“元字符”)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。例如,在Python中,可以使用re模块来使用正则表达式。正则表达式的主要应用包括:数据验证、搜索和替换操作等。

a910247的博客 2500

【Python网络爬虫】python爬虫用正则表达式进行数据清洗与处理

在Python网络爬虫的数据清洗与处理过程中,正则表达式是一个非常强大的工具,它可以帮助我们从复杂的文本数据中提取出所需的信息。在Python中,re模块提供了对正则表达式的支持。

左手の明天的博客 1969

【笔记】Python网络爬虫与信息提取

python 网络爬虫

qq_45192089的博客 3364
上一篇: Python爬虫(四)—深入学习Selenium
下一篇: Python爬虫(六)—解析利器 BeautifulSoup
luoz_python
博客等级 码龄10年 57粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值