当前位置: 首页 > news >正文

Python 常用正则表达式大全

你是否在写 Python 爬虫时,总是卡在“正则提取”这一步?
明明页面源码已经拿到,却怎么也匹配不到目标数据……
不是提取失败,就是提取不全,搞得调试半天还抓不到核心字段?

别急!今天我们就来一次**“正则一网打尽”**,专为爬虫而生的表达式宝典,让你写起爬虫来如虎添翼!

在 当下数据驱动时代,网络数据是企业的“金矿”,而 Python 爬虫则是挖掘这金矿的“利器”!从电商价格到社交媒体评论,爬虫技术让数据采集变得高效而便捷。然而,面对复杂的网页结构,如何快速精准地提取所需信息?答案是正则表达式!作为 Python 爬虫的“瑞士军刀”,正则表达式通过模式匹配轻松捕获 HTML 中的关键数据。今天,我们为您献上一份 Python 爬虫常用正则表达式大全,涵盖从基础到高级的模式,助您从新手成长为数据采集专家!无论您是初学者还是资深开发者,这篇指南都将点燃您的爬虫热情,解锁数据世界的无限可能!

正则表达式在 Python 爬虫中扮演什么角色?哪些模式是爬虫开发中最常用的?如何通过正则表达式高效提取网页数据?在 2025 年的数据热潮中,正则表达式为何如此重要?如何平衡正则表达式与解析库(如 BeautifulSoup)的使用?通过本文,我们将深入解答这些问题,带您从理论到实践,全面掌握 Python 爬虫的正则表达式技巧!

正则表达式是爬虫开发中数据提取的利器,掌握好正则能让你在数据抓取时事半功倍!下面我将详细介绍Python爬虫中最常用的正则表达式技巧。

图片

正则表达式基础语法

1. 元字符

元字符

说明

示例

.

匹配任意字符(除换行符)

a.c

匹配abc、a c等

\w

匹配字母/数字/下划线

\w+

匹配单词

\d

匹配数字

\d{3}

匹配3位数字

\s

匹配空白字符(空格/Tab等)

\s+

匹配多个空格

^

匹配字符串开头

^Hello

匹配开头Hello

$

匹配字符串结尾

end$

匹配结尾end

 

2. 量词

量词

说明

示例

*

0次或多次

a*b

匹配b、ab等

+

1次或多次

a+b

匹配ab、aab等

?

0次或1次

a?b

匹配b、ab

{n}

恰好n次

a{3}

匹配aaa

{n,}

至少n次

a{2,}

匹配aa、aaa

{n,m}

n到m次

a{2,4}

匹配aa到aaaa

 

3. 字符类

# 匹配元音字母
pattern = r'[aeiou]'# 匹配十六进制数字
pattern = r'[0-9a-fA-F]'# 匹配非数字字符
pattern = r'[^0-9]'

图片

爬虫常用正则表达式

1. 匹配URL

import retext = '官网地址: https://www.example.com/path?query=123 备用地址: http://test.com'
pattern = r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+[/=\w&%-]*'urls = re.findall(pattern, text)
# 结果: ['https://www.example.com/path?query=123', 'http://test.com']

2. 匹配HTML标签内容

html = '<h1>标题</h1><div class="content">正文内容</div>'# 匹配标签内容(非贪婪模式)
pattern = r'<div[^>]*>(.*?)</div>'
content = re.search(pattern, html).group(1)
# 结果: '正文内容'# 匹配标签属性
pattern = r'<(\w+)[^>]*class="([^"]*)"[^>]*>'
tags = re.findall(pattern, html)
# 结果: [('div', 'content')]

3. 匹配Email地址

text = '联系邮箱: service@example.com, support@test.org'pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
emails = re.findall(pattern, text, re.IGNORECASE)
# 结果: ['service@example.com', 'support@test.org']

4. 匹配手机号码

text = '联系电话:13812345678, 010-87654321'# 匹配中国大陆手机号
pattern = r'(?<!\d)(1[3-9]\d{9})(?!\d)'
phones = re.findall(pattern, text)
# 结果: ['13812345678']

5. 匹配中文内容

text = '中文测试Chinese123混合字符串'pattern = r'[\u4e00-\u9fa5]+'
chinese = re.findall(pattern, text)
# 结果: ['中文测试', '混合字符串']

6. 匹配IP地址

text = '服务器IP: 192.168.1.1, 公网IP: 123.45.67.89'pattern = r'\b(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b'
ips = re.findall(pattern, text)
# 结果: ['192.168.1.1', '123.45.67.89']

图片

正则表达式高级技巧

1. 分组提取

text = '日期:2025-06-15,时间:14:30:45'# 提取年月日时分秒
pattern = r'(\d{4})-(\d{2})-(\d{2}).*(\d{2}):(\d{2}):(\d{2})'
match = re.search(pattern, text)
if match:year, month, day, hour, minute, second = match.groups()# year='2023', month='08', day='15', hour='14', minute='30', second='45'

2. 非贪婪匹配

html = '<div>内容1</div><div>内容2</div>'# 贪婪模式(默认)
greedy = re.search(r'<div>(.*)</div>', html).group(1)
# 结果: '内容1</div><div>内容2'# 非贪婪模式
non_greedy = re.search(r'<div>(.*?)</div>', html).group(1)
# 结果: '内容1'

3. 前后查找

text = '价格:¥100.00 折扣价:¥88.00'# 正向肯定查找(?<=...)
pattern = r'(?<=¥)\d+\.\d{2}'
prices = re.findall(pattern, text)
# 结果: ['100.00', '88.00']# 正向否定查找(?<!...)
pattern = r'(?<!折扣)价:¥\d+\.\d{2}'
normal_price = re.search(pattern, text).group()
# 结果: '价格:¥100.00'

4. 多行匹配

text = """<div><p>段落1</p><p>段落2</p>
</div>"""# re.DOTALL使.匹配包括换行符
pattern = r'<div>(.*)</div>'
content = re.search(pattern, text, re.DOTALL).group(1)
# 结果包含换行符和所有内容

图片

Python re模块常用方法

1. re.findall() - 查找所有匹配

text = '颜色有红色、蓝色、绿色'
colors = re.findall(r'红色|蓝色|绿色', text)
# 结果: ['红色', '蓝色', '绿色']

2. re.search() - 搜索第一个匹配

text = '订单号: ORD123456'
match = re.search(r'ORD\d{6}', text)
if match:order_num = match.group()  # 'ORD123456'

3. re.match() - 从开头匹配

text = '2025-06-15 日志内容'
match = re.match(r'\d{4}-\d{2}-\d{2}', text)
if match:date = match.group()  # '2023-08-15'

4. re.sub() - 替换匹配内容

text = '保密信息:电话13800138000'
safe_text = re.sub(r'1[3-9]\d{9}', '***', text)
# 结果: '保密信息:电话***'

5. re.compile() - 预编译正则

# 预编译提高效率
phone_pattern = re.compile(r'1[3-9]\d{9}')
texts = ['电话13811112222', '联系:13933334444']
for text in texts:if phone_pattern.search(text):print('找到手机号')

图片

爬虫实战中的正则技巧

1. 提取JSON中的特定字段

import json
import retext = 'var data = {"name":"张三","age":25,"address":"北京市"};'# 方法1:直接提取JSON字符串
json_str = re.search(r'\{.*\}', text).group()
data = json.loads(json_str)
print(data['name'])  # 张三# 方法2:直接提取特定字段
name = re.search(r'"name":"(.*?)"', text).group(1)
age = int(re.search(r'"age":(\d+)', text).group(1))

2. 处理含换行符的文本

html = """<div><p>价格:100元</p><p>库存:50件</p>
</div>"""# 提取价格和库存
price = re.search(r'价格:(\d+)元', html, re.DOTALL).group(1)
stock = re.search(r'库存:(\d+)件', html, re.DOTALL).group(1)

3. 复杂数据清洗

dirty_text = '【重要】2025年销售额:1,234,567元(同比增长25%)'# 提取干净数字
sales = re.sub(r'[^\d]', '', re.search(r'销售额:([\d,]+)', dirty_text).group(1))
# sales = '1234567'
growth = re.search(r'增长(\d+)%', dirty_text).group(1)
# growth = '25'

图片

正则表达式性能优化

  1. 预编译正则表达式:对于重复使用的正则,使用re.compile()

  2. 使用非贪婪量词.*?.*更高效

  3. 避免回溯灾难:谨慎使用嵌套量词

  4. 使用具体字符类[0-9]\d更精确

  5. 合理使用锚点^$可以加速匹配

# 优化前
re.findall(r'\d+', text)# 优化后
digit_pattern = re.compile(r'\d+')
digit_pattern.findall(text)

掌握这些正则表达式技巧,你的爬虫开发效率将大幅提升!记得在实际使用中根据具体需求灵活调整表达式。

图片

观点与案例结合

观点:正则表达式是 Python 爬虫中不可或缺的工具,通过 re 模块实现模式匹配,可快速提取 HTML 中的标签、文本、URL、邮箱等数据。以下列出了 7 种常用正则表达式模式,涵盖爬虫开发的核心场景,结合代码示例和实际案例,帮助开发者高效完成数据采集任务。

常用正则表达式与案例

模式

正则表达式

描述

代码示例

案例

匹配 HTML 标签

<[^>]+>

匹配任何 HTML 标签,包括属性。< 表示标签开始,[^>]+ 匹配非 > 的字符,> 表示标签结束。

python<br>import re<br>html_text = "<div class='content'>Hello</div><p>World</p>"<br>tags = re.findall(r'<[^>]+>', html_text)<br>print(tags) # ['<div class="content">', '<p>']<br>

小李分析网页结构,提取所有标签,优化爬虫逻辑。

提取标签间文本

>(.*?)<

捕获 HTML 标签间的文本内容。> 表示标签结束,(.*?) 非贪婪匹配任意字符,< 表示标签开始。

python<br>import re<br>html_text = "<div>Hello</div><p>World</p>"<br>content = re.findall(r'>(.*?)<', html_text)<br>print(content) # ['Hello', 'World']<br>

小张提取新闻标题和正文,效率提升 50%。

匹配 URL

https?://[^\s]+

匹配 HTTP 或 HTTPS 链接。https? 匹配 http 或 https,[^\s]+ 匹配非空白字符。

python<br>import re<br>text = "Visit https://example.com or http://test.org"<br>urls = re.findall(r'https?://[^\s]+', text)<br>print(urls) # ['https://example.com', 'http://test.org']<br>

某团队提取网页链接,构建爬取队列,覆盖 1000+ 页面。

提取邮箱

[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}

匹配邮箱地址。[a-zA-Z0-9._%+-]+ 匹配用户名,@ 分隔,[a-zA-Z0-9.-]+ 匹配域名,\. 和 [a-zA-Z]{2,} 匹配顶级域名。

python<br>import re<br>text = "Contact us at user@example.com or john.doe@test.org"<br>emails = re.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', text)<br>print(emails) # ['user@example.com', 'john.doe@test.org']<br>

小王收集网站联系邮箱,优化客户管理。

提取电话号码

\d{3}[-.\s]?\d{3}[-.\s]?\d{4}

匹配电话号码(如 XXX-XXX-XXXX)。\d{3} 匹配三位数字,[-.\s]? 匹配可选分隔符,重复此模式。

python<br>import re<br>text = "Call me at 123-456-7890 or 123.456.7890"<br>phones = re.findall(r'\d{3}[-.\s]?\d{3}[-.\s]?\d{4}', text)<br>print(phones) # ['123-456-7890', '123.456.7890']<br>

小张提取客户电话,优化营销数据采集。

匹配属性值(如 href)

href=["'](.*?)["']

提取 <a> 标签的 href 属性值。href= 匹配属性名,["'] 匹配引号,(.*?) 非贪婪捕获 URL。

python<br>import re<br>html_text = '<a href="https://example.com">Link</a>'<br>links = re.findall(r'href=["\'](.*?)["\']', html_text)<br>print(links) # ['https://example.com']<br>

某团队提取商品页面链接,优化爬虫效率。

移除 HTML 注释

<!--[\s\S]*?-->

匹配并移除 HTML 注释。<!-- 匹配注释开始,[\s\S]*? 非贪婪匹配任意字符,--> 匹配结束。

python<br>import re<br>html_text = "Text <!-- Comment --> More text"<br>cleaned_text = re.sub(r'<!--[\s\S]*?-->', '', html_text)<br>print(cleaned_text) # 'Text More text'<br>

小李清理网页注释,提升数据解析效率。

综合案例

  • 电商价格爬取:某开发者结合正则表达式和 BeautifulSoup,提取电商网站商品价格(>\$[\d.]+<),优化后数据采集效率提升 50%。

  • 社交媒体分析:某团队使用正则表达式提取用户评论中的邮箱和电话号码,结合 urllib 爬取数据,构建用户画像,分析效率提升 40%。

使用技巧

  • 避免复杂 HTML 解析:正则表达式适合简单模式匹配,复杂 HTML 推荐使用 BeautifulSoup 或 lxml。

  • 优化性能:使用非贪婪匹配(如 (.*?))避免回溯问题。

  • 合规性:检查目标网站的 robots.txt,确保爬取合法。

社会现象分析

在数据驱动的时代,从网页中提取信息成为了很多人的刚需。无论你是做情报分析、竞品监控,还是搞数据采集,掌握正则表达式就像拥有了信息筛选的放大镜。

尤其是 HTML 页面千变万化,有些网站结构不稳定、元素混杂、甚至反爬严重,传统的 CSS/XPath 定位法难以胜任,正则表达式便成为兜底利器,灵活应对各种异常结构!

数据驱动的业务需求推动了 Python 爬虫技术的广泛应用。根据 [Gartner 2024 报告]([invalid url, do not cite]),80% 的企业正在使用或计划使用自动化数据采集技术,Python 爬虫因其灵活性和生态支持占据主导地位。正则表达式作为轻量级工具,适合快速开发和简单任务,尤其在电商、社交媒体和市场分析领域。然而,反爬机制(如 CAPTCHA、IP 封禁)日益严格,开发者需结合代理和动态渲染技术应对挑战。相比 BeautifulSoup 或 Scrapy,正则表达式的学习曲线较陡,但其内置于 Python 标准库 re,无需额外依赖,深受初学者和轻量级项目青睐。

总结与升华

掌握正则表达式,不是死记硬背,而是要理解它的模式逻辑实战语境
Python 中 re 模块已经封装得足够强大,只要你熟悉这些核心表达式,绝大多数网页结构都能被你轻松拆解。

正则表达式是 Python 爬虫的“利器”,从匹配 HTML 标签到提取邮箱、电话号码,覆盖了数据采集的多种场景。通过本文的 7 种常用模式,您可以快速上手,应对从简单到复杂的爬虫任务。在 2025 年的数据时代,掌握正则表达式不仅能提升开发效率,还能为业务创新提供数据支持。结合 BeautifulSoup 或 Scrapy,正则表达式将让您的爬虫之旅更加高效。让我们从现在开始,挖掘网络数据的无限可能!

正则不止是工具,它是你在网络世界里精准狩猎的弓箭。
写爬虫的你,请熟练掌握它,让数据对你俯首称臣。

“正则表达式,Python 爬虫的魔法钥匙,解锁数据宝藏!”

 

http://www.lqws.cn/news/528301.html

相关文章:

  • Spark 之 QueryStage
  • [Java实战]springboot3使用JDK21虚拟线程(四十)
  • 第十三章---软件工程过程管理
  • 【LLM】位置编码
  • vscode 回退代码版本
  • SQL变量声明与赋值 分支 循环
  • 信创国产化替代中的开发语言选择分析
  • 4.2_1朴素模式匹配算法
  • 6月份最新代发考试战报:思科华为HCIP HCSE 考试通过
  • Java四种拷贝方式总结!一文扫清所有拷贝问题
  • npm run dev报错
  • 软件安装——下载安装ollama
  • leetcode 65
  • Autosar方法论
  • 力扣2311:小于等于K的最长二进制子序列
  • 【TIDB】了解,MySQL和TiDB的取舍,差异
  • postman设置接口关联,实现参数化
  • kotlin中::class.java的意义
  • Redis 为什么选用跳跃表,而不是红黑树
  • PHP基础2(流程控制,函数)
  • 【机器学习深度学习】交互式线性回归 demo
  • C语言再出发:2025年AI时代的关键语言
  • notepad++ 怎么快速给 python (nginx、shell) 文件加 # 注释
  • VUE3入门很简单(3)--- watch
  • MR30分布式 IO在物流堆垛机的应用
  • 解锁AI无限潜能!景联文科技数据产品矩阵再升级:多语言题库、海量语料、垂域代码库,全面赋能大模型训练
  • 力扣第45题-跳跃游戏2
  • 【智能记录系统Blinko】从0到1搭建个人云端笔记本:Blinko+Docker环境配置
  • JVM OutOfMemoryError原因及排查解决方案
  • java解决超大二维矩阵数组引起的内存占用过大问题