Day31.爬虫基础之re

科研党必看!Zotero+Claude3插件实战:如何用AI高效阅读文献(附详细配置步骤) 本文详细介绍了如何通过Zotero与Claude3插件的深度整合,实现科研文献的高效阅读与管理。从环境配置到核心功能实战,包括智能摘要生成、精准学术翻译和论文写作辅助等,帮助科研人员大幅提升工作效率。特别适合需要处理大量文献的研究者使用。 阅读详情

爬虫基础之re



前言

本文主要的内容是关于正则表达式的简单使用和案例展示。


一. re 基本操作

1.1 常见匹配模式

模式描述
\w匹配字母数字及下划线
\W匹配非字母数字下划线
\s匹配任意空白字符,等价于 [\t\n\r\f].
\S匹配任意非空字符
\d匹配任意数字,等价于 [0-9]
\D匹配任意非数字
\A匹配字符串开始
\Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\z匹配字符串结束
\G匹配最后匹配完成的位置
\n匹配一个换行符
\t匹配一个制表符
^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[…]用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’
[^…]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
*匹配0个或多个的表达式。
+匹配1个或多个的表达式。
?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{n}精确匹配n个前面表达式。
{n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a|b匹配a或b
( )匹配括号内的表达式,也表示一个组

re.match:re.match(pattern, string, flags=0)
re.match() 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就会返回None。

1.2 最常规的匹配

import re

content = "Hello 123 4567 World_This is a Regex Demo!"
print(len(content))

# ‘^’表示以什么开始,‘$’以什么结束。
# ‘\s’匹配任意空白字符,'\d'匹配数字,‘\w’匹配字母数字下划线‘{n}’表示匹配n次。
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}.*Demo!$', content)
print(result)
print(result.group())
print(result.span())

1.3 范匹配

content = 'Hello 123 4567 World_This is a Regex Demo'
result = re.match('^Hello.*Demo$', content)
print(result)
print(result.group())
print(result.span())

这里我们发现‘.*’其实匹配所有的字符,所以内容就比较宽泛。

1.4 匹配目标

# ‘\s’匹配任意空白字符。
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^Hello\s(\d+)\sWorld.*Demo$', content)
print(result)
print(result.group(1))
print(result.span())

在这里,小括号单独表示我们需要匹配的内容,即精确匹配,可单独拿出。

二. re 高级操作

2.1 贪婪匹配

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

# 我们看到,由于 “.*” 可以匹配任何的内容,而且是贪婪匹配,所以小括号仅匹配到一个 ‘7’ ,也就是最后一个数字。

2.2 非贪婪匹配

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

这里我们看到,由于 ‘.?’ 比起前面的贪婪模式 ‘.’ 多了个 ‘?’.但是我们看匹配到的内容,显然,小括号匹配到了所有的数字。

所以总结来看就是:贪婪模式就是尽可能多的匹配到内容,非贪婪模式就是尽可能少的匹配到内容。

2.3 匹配模式

content = '''Hello 1234567 World_This
is a Regex Demo
'''

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

这里 re.S 表示不考虑像换行符,空格之类的内容;而另外一种 re.I 表示不考虑匹配的字母大小写

2.4 转义操作

content = 'price is $5.00'
result = re.match('price is $5.00', content)
print(result)


content = 'price is $5.00'
result = re.match('price is \$5\.00', content)
print(result)

2.5 re.search()

re.search() 扫描整个字符串并返回第一个成功的匹配。

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
result = re.match('Hello.*?(\d+).*?Demo', content)
print(result)


content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
result = re.search('Hello.*?(\d+).*?Demo', content)
print(result)
print(result.group(1))

对比一下 re.match() 与 re.search(),发现 re.match() 只要第一个字符匹配不上就不会匹配成功,但是 re.search() 会扫描整个字符串。

总结:为匹配方便,能用search就不用match

2.6 匹配练习

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="邓丽君"><i class="fa fa-user"></i>但愿人长久</a>
        </li>
    </ul>
</div>'''

result = re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>', html, re.S)
print(result.group())
print(result.group(1), result.group(2))

# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #

result = re.search('<li.*?singer="(.*?)">(.*?)</a>', html, re.S)

print(result.group())
print(result.group(1), result.group(2))

# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #

result = re.search('<li.*?singer="(.*?)">(.*?)</a>', html)
print(result.group())
print(result.group(1), result.group(2))

# 这里不同于上面一行的是,少了个 re.S 导致换行没法处理,所以只能匹配到一行的内容(前面几个都有换行符,导致匹配不成功)。

re.findall() 搜索字符串,一列表形式返回全部能匹配的字符串

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.*?href="(.*?)" singer="(.*?)">(.*?)</a>', html, re.S)
print(results)
print(type(results))
for result in results:
    print(result)
    print(result[0], result[1],result[2])

# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #

results = re.findall('<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>', html, re.S)
print(results)
for result in results:
    print(result[1])

re.sub() 替换字符串中每一个匹配的子串后返回替换后的字符串。

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
# 将字符串中的数字都转换成None,也就是删除了所有的数字
content = re.sub('\d+', '', content)
print(content)

# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
# 将字符串中的所有数字转换成 Replacement
content = re.sub('\d+', 'Replacement', content)
print(content)

# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #

content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
content = re.sub('(\d+)', r'\1 8910', content)
print(content)

re.compile()
将正则字符串编译成正则表达式对象,以便于复用该匹配模式。

content = '''Hello 1234567 World_This
is a Regex Demo'''

pattern = re.compile("Hello.*Demo", re.S)
result = re.match(pattern, content)
print(result)

2.7 实战练习

import requests
import re

headers = {
    "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Mobile Safari/537.36"
}

content = requests.get('https://douban.com/book/top250', headers=headers).text
print(content)

pattern = re.compile('<tr class="item">.*?href="(.*?)" onclick.*?src="(.*?)" width.*?<a href="(.*?)" onclick.*?title="(.*?)">.*?p1">(.*?)</p>.*?rating_nums">(.*?)</span.*?p1">((.*?))<.*?inq">(.*?)<.*?</table>', re.S)
results = re.findall(pattern, content)
print(results)

总结

今天主要是学习了正则表达式re库的基本使用以及一些升级操作,还是需要不断的在实战的演练。有兴趣的小伙伴可以观看官方文档,进行深入了解。

溜了溜了,脑壳疼。Loading(31/100)。。。

CVE-2021-22205 GITLAB 未授权 RCE 漏洞 简介 GitLab是由GitLab Inc.开发的一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,可通过Web界面访问公开或私人项目。由于GitLab存在未授权的端点,导致该漏洞在无需进行身份验证的情况下即可进行利用。 漏洞利用 上工具 python3 poc import sys import requests from bs4 import BeautifulSoup requests.packages.urllib3.disable_warnings() def . 阅读详情

相关推荐

【代码审计】RuoYi定时任务漏洞:从SQL注入到RCE的攻防演变

本文深入剖析了RuoYi框架定时任务模块从早期版本无校验到引入黑白名单机制,再到被组合利用实现RCE的完整漏洞演变过程。文章详细分析了SQL注入与定时任务功能结合导致的远程代码执行漏洞,并总结了代码审计与安全开发的核心要点,为开发者提供了重要的安全参考。

yellow的专栏 699

re模块之网络爬虫基础

Python之所以能从这么多编写语言中脱引而出的优点就是它有众多的第三方库函数,可以更高效率的实现开发。

weixin_52596593的博客 813

DIY压电陶瓷传感器信号放大:从拆解到JFET电路实战(附示波器实测数据)

本文详细介绍了如何利用废旧设备拆解的压电陶瓷片,结合JFET(结型场效应管)高输入阻抗特性,DIY搭建高灵敏度振动传感器放大电路。从元件拆解、参数实测到JFET共源极放大器实战搭建与调试,提供了完整的步骤、示波器实测数据及优化方案,帮助电子爱好者实现低功耗振动检测应用。

weixin_29195615的博客 389

正则split 以及 finditer 和 findall 的区别

re.split 函数 re.split(pattern,str,maxsplit=0,flags=0) 参数: pattern:cpmpile生成的正则表达式对象,或者自定义的也可以 str:要匹配的字符串 maxsplit:最大分割次数,不指定将全部分割 flags参数: re.I(re.IGNORECASE) 使匹配对大小写不敏感 re...

随灬亦 580

S32DS 3.5.8离线包怎么用?保姆级教程教你手动安装S32K3开发环境(附资源下载)

本文详细介绍了S32DS 3.5.8离线包的安装方法,适用于S32K3开发环境的手动搭建。从资源获取、完整性验证到分步安装指南,提供了全面的离线部署解决方案,特别适合军工/车企内网开发等场景。文章还包含版本选择建议、常见问题排查及团队协作方案,帮助开发者高效完成环境配置。

weixin_30471561的博客 477

Calibre PEX提取HSPICE网表时如何避免‘net 0‘错误?实测解决方案分享

本文详细解析了Calibre PEX提取HSPICE网表时出现的'net 0'错误,提供了从规则文件修改到网表后处理的四步解决方案。通过实战案例和进阶调试技巧,帮助工程师有效避免节点映射错误,确保后仿真精度。特别针对SPICE netlist生成机制提出了优化建议。

weixin_29279153的博客 387

『python爬虫』06. 数据解析之re正则解析(保姆级图文)

『python爬虫』06. 数据解析之re正则解析(保姆级图文)

MZH 1843

示波器实测RGMII信号:从125MHz时钟判断千兆模式,到时序抓取与PHY寄存器避坑

本文详细介绍了使用示波器实测RGMII信号的完整流程,包括125MHz时钟频率判断、时序参数测量及PHY寄存器配置避坑指南。通过实战操作和典型故障案例分析,帮助硬件工程师快速定位和解决千兆以太网接口的调试问题,提升通信稳定性。

weixin_30015371的博客 260

Python爬虫代码分享01——(re 正则表达式爬取数据)

爬虫就一段模拟用户上网并从互联网中获取信息的程序人们正常上网过程:通过浏览器提交请求给网站服务器(打开浏览器输入网址或者通过搜索引擎搜索打开网址) --> 下载网页代码 --> 浏览器解析成页面 --> 用户浏览爬虫爬取信息的过程:模拟浏览器发送请求获取网页代码 --> 按照代码设置提取有用的数据 --> 存放于数据库或文件中。

Janice01的博客 1397

DJI MobileSDK运行实例代码教程(保姆级)坑踩完了

其中比较重要的是PackageName也就是我们应用的包名,在这里我们可以直接使用官方文档中的包名,com.dji.ImportSDKDemo,appname为:ImportSDKDemo,其他的可以随意。在C盘中根据路径先找到 “用户/admin/.gradle”下的.gradle文件夹,然后依次打开wrapper/dists文件夹,找到我们刚刚要下载的gradle版本名的文件夹。在Androidstudio中打开,选在打开项目选择文件下载后的保存路径(解压之后的),在打开项目后会自动下载gradle。

k1121568的博客 2863

基于Simulink的电力电子负载特性模拟仿真实例

电阻性负载是最简单的负载形式,其阻抗为纯电阻,电流和电压之间的关系符合欧姆定律。电阻性负载的特点是消耗能量,不会存储能量。本示例将以一个典型的直流电源供电系统为例,展示如何利用Simulink进行不同负载特性的仿真模拟。直流电源:提供固定电压输入。逆变器(可选):根据需要产生PWM调制信号,驱动负载。负载模块:模拟不同类型的负载特性,如电阻性负载、电感性负载和容性负载。测量模块:用于观察负载上的电压和电流波形。系统架构视图plaintext深色版本v| || |

xiaoheshang_123的博客 429

Python--爬虫--re(正则表达式)入门

Python--爬虫(爬取2)--re入门

qq_57663276的博客 1064

Android Framework 开发工程师职位深度解析与面试指南

摘要:博泰车联网科技(上海)股份有限公司招聘Android Framework开发工程师,负责车载系统的底层开发与优化。岗位要求5年以上经验,深入掌握Android Framework机制(WindowManager、PowerManager等模块),熟悉高通平台中间件架构及NDK/JNI开发,具备性能优化(启动时间、ANR处理)、OTA升级等能力。需熟练使用Android Studio、Git等工具,有车载开发经验者优先。工作内容包括Framework定制开发、问题排查及技术文档编写。

郑伟强dev的专栏 552

python网络爬虫基础day02

  2019.5.15,今天继续跟着波波老师学习爬虫开发。主要学了数据解析,总结今天学的知识: 聚焦爬虫:爬取页面中指定的页面内容。 -编码流程: - 指定urL发起请求 - 获取响应数据 - 数据解析 - 持久化存储数据解析分类: - 正则 - bs4 - xpath(重点)数据解析原理概述: - 解析的局部...

weixin_30410999的博客 259

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...

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python 全栈开发,Day31(re模块)

python 全栈开发,Day31(re模块) 回顾昨天的内容 异常处理 try except 一定要在except之后写一些提示或者处理的内容 try: '''可能会出现异常的代码''' except ValueError: '''打印一些提示或者处理的内容''' except NameError: ...

shykevin的博客 477

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

py爬虫入门笔记(requests.get的使用)

简单爬虫的使用,包括request.get、xpath、re模块、线程池的语法

m0_53005929的博客 4713

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

day 31 (re模块 + 正则表达式)

正则表达式 讲正题之前我们先来看一个例子:https://reg.jd.com/reg/person?ReturnUrl=https%3A//www.jd.com/ 这是京东的注册页面,打开页面我们就看到这些要求输入个人信息的提示。假如我们随意的在手机号码这一栏输入一个11111111111,它会提示我们格式有误。这个功能是怎么实现的呢?假如现在你用python写一段代码,类似: pho...

weixin_30316097的博客 75

玩转Python爬虫中的正则表达式:从原理到实战!

正则表达式(Regular Expression,简称RE)是一种用于匹配文本的强大工具。它通过一些特殊字符(称为元字符)和模式,能够在文本中进行搜索、替换和解析操作。Python中的。

switch616的博客 955

DAY-02

爬取豆瓣网站电影top250 1 """ 2 请求头: 3 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 4 5 cookie:    bid=E...

weixin_30919919的博客 100

Python爬虫学习,抓取网页上的天气信息

# coding : UTF-8 import sys reload(sys) sys.setdefaultencoding( "utf-8" ) from bs4 import BeautifulSoup import csv import urllib def get_html(url): html = urllib.urlopen(url) return html.read()

rjq235的专栏 3965

Python爬虫实战:从深交所官网抓取A股交易日历并封装工具

在量化交易与金融数据分析领域,准确判断交易日是数据处理与策略回测的基础。其核心原理在于获取并解析权威的交易日历数据,以规避法定节假日、调休等非周末休市情况,确保策略逻辑与数据抓取的准确性。这一技术对于构建稳健的量化系统具有重要价值,广泛应用于自动化交易信号生成、历史数据清洗及监控脚本调度等场景。本文以Python爬虫技术为核心,详细讲解如何通过requests与BeautifulSoup库,从深交所官网静态页面稳定抓取交易日数据,并设计包含本地JSON缓存的健壮工具函数,自然融入了【静态页面抓取】与【数据缓

diaohuyi6830的博客 465

写爬虫获取天气数据

不多说了,直接上代码,详情看注释。 import re import requests import csv import codecs import datetime class Weather: def __init__(self,city_id): self.city_id = city_id self.url = 'http://www.we...

qq_41997988的博客 1489

Python爬虫获取迅雷会员帐号

代码如下: 1 import re 2 import urllib.request 3 import urllib 4 import time 5 6 from collections import deque 7 8 head = { 9 'Connection': 'Keep-Alive', 10 'Accept': 'text/...

weixin_30457465的博客 498

Python-100-Days案例拆解:4个经典案例看懂查找、排序、爬虫与机器学习的实现套路

读Python教程最怕"看懂了却写不出"。这次我们对Python-100-Days做一轮案例解析,从项目里挑出四个最有代表性的代码案例,逐个讲清楚它们是解决什么问题的、关键代码为什么这样写,以及这些套路你之后能在哪些场景直接搬过去用。 ## 项目速览:100天里装了什么 Python-100-Days是一份按"天"组织的Python学习资料,覆盖语法基础、Web开发、爬虫、数据分析到机器学习五

gitblog_00611的博客 1031

five day --模块

常用模块(记忆力)re模块collections模块时间模块random模块 随机数、打乱顺序os模块 操作系统sys模块 python解释器相关的模块 引入:模块 py文件 是写好了,但不直接使用的功能 内置模块:安装完python自带的 扩展模块:jagal 爬虫、自动化测试、AI,数据挖掘等 https://pypi.org/网址有所...

weixin_30600503的博客 115

day4作业

上课内容笔记 亓2019/6/148:22:07昨日回顾:  爬虫原理:  什么是爬虫?    爬虫指的是爬取数据。  什么是互联网?    由一堆网络设备把一台一台的计算机互联到-起。  互联网建立的目的?    数据的传递与数据的共享。  上网的全过程:  一普通用户    打开浏览器一>往目标站点发送请求一>接收响应数据一>渲染到页面上。  一爬虫程序   ...

weixin_34007020的博客 196
上一篇: Day30.爬虫基础之Requests
下一篇: Day32.爬虫基础之BeautifulSoup
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值