一文掌握python中正则表达式的各种使用

news2025/2/26 14:52:20

文章目录

    • 1. 正则表达式基础
      • 1.1 常用元字符
      • 1.2 基本用法
    • 2. 正则表达式高级功能
      • 2.1 分组捕获
      • 2.2 命名分组
      • 2.3 非贪婪匹配
      • 2.4 零宽断言
      • 2.5 编译正则表达式
      • 2.6 转义字符
    • 3. 常见应用场景
      • 3.1 验证邮箱格式
      • 3.2 提取 URL
      • 3.3 提取日期
      • 3.4 提取HTML中的链接
      • 3.5 提取HTML中的图片链接
      • 3.6 提取JSON中的特定字段
    • 4. 总结

在Python爬虫中, 正则表达式Regular Expression,简称Regex)是一种强大的工具,用于从文本中提取、匹配和替换特定的字符串模式。正则表达式可以帮助我们从HTML、JSON等格式的文本中提取所需的数据。

1. 正则表达式基础

1.1 常用元字符

正则表达式由一系列字符和特殊符号组成,用于定义匹配模式。以下是一些常用的正则表达式元字符:

  • . 匹配任意字符(除了换行符 \n)
  • ^ 匹配字符串的开头
  • $ 匹配字符串的结尾
  • * 匹配前面的字符 0 次或多次
  • + 匹配前面的字符 1 次或多次
  • ? 匹配前面的字符 0 次或 1 次
  • {n} 匹配前面的字符恰好 n 次
  • {n,} 匹配前面的字符至少 n 次
  • {n,m} 匹配前面的字符至少 n 次,至多 m 次
  • \d 匹配数字(等价于 [0-9])
  • \D 匹配非数字(等价于 [^0-9])
  • \w 匹配字母、数字或下划线(等价于 [a-zA-Z0-9_])
  • \W 匹配非字母、数字或下划线
  • \s 匹配空白字符(空格、制表符、换行符等)
  • \S 匹配非空白字符
  • [...] 匹配括号内的任意一个字符
  • [^...] 匹配不在括号内的任意一个字符

1.2 基本用法

Python提供了re模块来支持正则表达式的操作。以下是re模块中常用的函数:

  • re.search(pattern, string):在字符串中搜索匹配正则表达式的第一个位置,返回一个匹配对象。如果没有匹配项,返回None。
  • re.match(pattern, string):从字符串的开头开始匹配正则表达式,返回一个匹配对象。如果没有匹配项,返回None。
  • re.findall(pattern, string):返回字符串中所有匹配正则表达式的子串,返回一个列表。
  • re.sub(pattern, repl, string):将字符串中所有匹配正则表达式的子串替换为repl,返回替换后的字符串。
  • re.compile(pattern):将正则表达式编译为一个正则表达式对象,可以重复使用。

Python 的 re 模块使用样例如下:

import re

# re.match()
result = re.match(r'hello', 'hello world')
if result:
    print("匹配成功:", result.group())  # 输出: 匹配成功: hello
else:
    print("匹配失败")

# re.search()
result = re.search(r'world', 'hello world')
if result:
    print("匹配成功:", result.group())  # 输出: 匹配成功: world
else:
    print("匹配失败")

# re.findall()
result = re.findall(r'\d+', '3 apples, 5 bananas, 10 cherries')
print(result)  # 输出: ['3', '5', '10']

#re.finditer()
matches = re.finditer(r'\d+', '3 apples, 5 bananas, 10 cherries')
for match in matches:
    print(match.group())  # 输出: 3, 5, 10

# re.sub()
text = '3 apples, 5 bananas, 10 cherries'
result = re.sub(r'\d+', 'X', text)
print(result)  # 输出: X apples, X bananas, X cherries

# re.split()
result = re.split(r'\s+', 'hello   world')
print(result)  # 输出: ['hello', 'world']

2. 正则表达式高级功能

2.1 分组捕获

使用 () 可以将匹配的内容分组,并通过 group() 方法获取。

import re

text = 'John: 30, Jane: 25'
result = re.search(r'(\w+): (\d+)', text)
if result:
    print("姓名:", result.group(1))  # 输出: 姓名: John
    print("年龄:", result.group(2))  # 输出: 年龄: 30

2.2 命名分组

可以为分组命名,方便后续引用。

import re

text = 'John: 30'
result = re.search(r'(?P<name>\w+): (?P<age>\d+)', text)
if result:
    print("姓名:", result.group('name'))  # 输出: 姓名: John
    print("年龄:", result.group('age'))  # 输出: 年龄: 30

2.3 非贪婪匹配

正则表达式默认是贪婪匹配,即尽可能多地匹配字符。例如,.*会匹配尽可能多的字符。可以使用.*?进行非贪婪匹配。

import re

text = '<div>content1</div><div>content2</div>'
result = re.findall(r'<div>(.*?)</div>', text)
print(result)  # 输出: ['content1', 'content2']

2.4 零宽断言

零宽断言用于指定匹配的位置,但不消耗字符。

  • 正向先行断言:(?=…),匹配后面是 … 的位置。
  • 负向先行断言:(?!..),匹配后面不是 … 的位置。
  • 正向后行断言:(?<=…),匹配前面是 … 的位置。
  • 负向后行断言:(?<!..),匹配前面不是 … 的位置。
import re

# 匹配后面是数字的字母
result = re.findall(r'\w+(?=\d)', 'apple3 banana5 cherry10')
print(result)  # 输出: ['apple', 'banana', 'cherry']

# 匹配前面是数字的字母
result = re.findall(r'(?<=\d)\w+', '3apple 5banana 10cherry')
print(result)  # 输出: ['apple', 'banana', 'cherry']

2.5 编译正则表达式

如果需要多次使用同一个正则表达式,可以将其编译为 re.Pattern 对象,以提高效率。

import re

pattern = re.compile(r'\d+')
result = pattern.findall('3 apples, 5 bananas, 10 cherries')
print(result)  # 输出: ['3', '5', '10']

2.6 转义字符

在正则表达式中,某些字符(如.、*、?等)具有特殊含义。如果要匹配这些字符本身,需要使用反斜杠\进行转义。例如,.匹配实际的.字符。

3. 常见应用场景

3.1 验证邮箱格式

import re

def validate_email(email):
    pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
    return re.match(pattern, email) is not None

print(validate_email('test@example.com'))  # 输出: True
print(validate_email('invalid-email'))    # 输出: False

3.2 提取 URL

import re

text = 'Visit https://www.example.com or http://example.org'
urls = re.findall(r'https?://[^\s]+', text)
print(urls)  # 输出: ['https://www.example.com', 'http://example.org']

3.3 提取日期

import re

text = 'Today is 2023-10-05, and tomorrow is 2023-10-06.'
dates = re.findall(r'\d{4}-\d{2}-\d{2}', text)
print(dates)  # 输出: ['2023-10-05', '2023-10-06']

3.4 提取HTML中的链接

假设我们要从HTML中提取所有的链接,可以使用正则表达式来匹配标签中的href属性。

import re

html = """
<a href="https://www.example.com">Example</a>
<a href="https://www.google.com">Google</a>
<a href="https://www.python.org">Python</a>
"""

# 正则表达式匹配<a>标签中的href属性
pattern = r'<a href="(.*?)">'

# 使用re.findall提取所有匹配的链接
links = re.findall(pattern, html)

print(links)
# 输出:['https://www.example.com', 'https://www.google.com', 'https://www.python.org']

3.5 提取HTML中的图片链接

假设我们要从HTML中提取所有的图片链接,可以使用正则表达式来匹配标签中的src属性。

import re

html = """
<img src="https://www.example.com/image1.jpg" alt="Image 1">
<img src="https://www.google.com/logo.png" alt="Google Logo">
<img src="https://www.python.org/python.png" alt="Python Logo">
"""

# 正则表达式匹配<img>标签中的src属性
pattern = r'<img src="(.*?)"'

# 使用re.findall提取所有匹配的图片链接
image_links = re.findall(pattern, html)

print(image_links)
# 输出:['https://www.example.com/image1.jpg', 'https://www.google.com/logo.png', 'https://www.python.org/python.png']

3.6 提取JSON中的特定字段

假设我们有一个JSON字符串,想要提取其中的某个字段,可以使用正则表达式来匹配。

import re

json_data = '{"name": "Alice", "age": 25, "city": "New York"}'

# 正则表达式匹配"name"字段的值
pattern = r'"name": "(.*?)"'

# 使用re.search提取匹配的字段值
match = re.search(pattern, json_data)

if match:
    print(match.group(1))

4. 总结

正则表达式是处理文本的强大工具,Python 的 re 模块提供了丰富的功能来支持正则表达式的使用。通过掌握基础语法和高级功能,可以轻松应对各种文本处理任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java.2.25

1. 注释 ​ 注释是对代码的解释和说明文字。 Java中的注释分为三种&#xff1a; 单行注释&#xff1a; // 这是单行注释文字多行注释&#xff1a; /* 这是多行注释文字 这是多行注释文字 这是多行注释文字 */ 注意&#xff1a;多行注释不能嵌套使用。文档注释&#xff1a;…

VScode 开发

目录 安装 VS Code 创建一个 Python 代码文件 安装 VS Code VSCode&#xff08;全称&#xff1a;Visual Studio Code&#xff09;是一款由微软开发且跨平台的免费源代码编辑器&#xff0c;VSCode 开发环境非常简单易用。 VSCode 安装也很简单&#xff0c;打开官网 Visual S…

A Large Recurrent Action Model: xLSTM Enables Fast Inference for Robotics Tasks

奥地利林茨约翰开普勒大学机器学习研究所 ELLIS 小组&#xff0c;LIT 人工智能实验室奥地利林茨 NXAI 有限公司谷歌 DeepMind米拉 - 魁北克人工智能研究所 摘要 近年来&#xff0c;强化学习&#xff08;Reinforcement Learning, RL&#xff09;领域出现了一种趋势&#xff0c;…

计算机毕业设计SpringBoot+Vue.js学科竞赛管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Deep Seek-编码器

1. DeepSeek Coder 简介 DeepSeek Coder 由一系列代码语言模型组成,每个模型都在 2T 令牌上从头开始训练,其中 87% 的代码和 13% 的自然语言在中英文中组成。我们提供各种大小的代码模型,从 1B 到 33B 版本。每个模型都通过采用 16K 的窗口大小和额外的填空任务在项目级代码…

Android平台轻量级RTSP服务模块技术对接说明

一、技术背景 随着内网无纸化办公、电子教室等应用场景对超低延迟音视频传输需求的日益增长&#xff0c;为避免用户或开发者单独部署 RTSP 或 RTMP 服务&#xff0c;大牛直播 SDK 推出了轻量级 RTSP 服务 SDK。该 SDK 能够将本地音视频数据&#xff08;如摄像头、麦克风等&…

RoCEv2 高性能传输协议与 Lossless 无损网络

目录 文章目录 目录RoCERoCEv2 v.s. IBRoCEv2 协议栈RoCEv2 需要 Lossless NetworkLossless Network 拥塞控制技术网络拥塞的原因PFC 基于优先级的流量控制PFC Unfairness &#xff08;带宽分配不公平&#xff09;的问题PFC HOL&#xff08;队头拥塞&#xff09;的问题PFC Dead…

联想 SR590 服务器 530-8i RAID 控制器更换损坏的硬盘

坏了的硬盘会自动亮黄灯。用一个空的新盘来替换&#xff0c;新盘最好不要有东西。但是有东西可能也没啥&#xff0c;因为我看 RAID 控制器里有格式化的选项 1. 从 IPMI 把服务器关机&#xff0c;电源键进入绿色闪烁状态 2. 断电&#xff0c;推开塑料滑块拉出支架&#xff0c;…

城电科技|会追日的智能花,光伏太阳花开启绿色能源新篇章

当艺术与科技相遇&#xff0c;会碰撞出怎样的火花&#xff1f;城电科技推出的光伏太阳花&#xff0c;以其独特的设计与智能化的功能&#xff0c;给出了答案。这款产品不仅具备太阳能发电的实用功能&#xff0c;更是一件充满科技属性的艺术性光伏产品&#xff0c;吸引了广泛关注…

基于YOLO11深度学习的苹果叶片病害检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

多智能体框架

多个不同的角色的Agent&#xff0c;共同完成一份复杂的工作。由一个统筹管理的智能体&#xff0c;自主规划多个智能体分别做什么&#xff0c;以及执行的顺序。 agent 应该包含的属性 执行特定任务 根据其角色和目标做出决策 能够使用工具来实现目标 与其他代理沟通和协作 保留…

C#中级教程(1)——解锁 C# 编程的调试与错误处理秘籍

一、认识错误&#xff1a;编程路上的 “绊脚石” 在 C# 编程中&#xff0c;错误大致可分为两类&#xff1a;语法错误和语义错误&#xff08;逻辑错误&#xff09;。语法错误就像是写作文时的错别字和病句&#xff0c;编译器一眼就能识别出来&#xff0c;比如变量名拼写错误、符…

Jmeter接口并发测试

Apache JMeter 是一款开源的性能测试工具&#xff0c;广泛用于接口并发测试、负载测试和压力测试。以下是使用 JMeter 进行接口并发测试的详细步骤&#xff1a; 一、准备工作 安装 JMeter 下载地址&#xff1a;Apache JMeter 官网 确保已安装 Java 环境&#xff08;JMeter 依…

MySQL-增删改查

一、Create(创建) &#x1f4d6; 语法&#xff1a; INSERT INTO table_name(value_list); 当我们使用表的时候&#xff0c;就可以使用这个语法来向表中插入元素~ 我们这边创建一个用于示范的表(Student)~ create table student( id int, name varchar(20), chinese int, math…

开源堡垒机 JumpServer 社区版实战教程:发布机的配置与Website资产配置使用

文章目录 开源堡垒机 JumpServer 社区版实战教程&#xff1a;发布机的配置与Website资产配置使用一、功能简述二、应用发布机2.1 版本要求2.2 创建应用发布机2.2.1 通过WinRM的协议进行应用发布机的创建2.2.2 通过OpenSSH的协议进行应用发布机的创建2.2.2.1 下载OpenSSH2.2.2.2…

代码随想录算法训练day64---图论系列8《拓扑排序dijkstra(朴素版)》

代码随想录算法训练 —day64 文章目录 代码随想录算法训练前言一、53. 117. 软件构建—拓扑排序二、47. 参加科学大会---dijkstra&#xff08;朴素版&#xff09;总结 前言 今天是算法营的第64天&#xff0c;希望自己能够坚持下来&#xff01; 今天继续图论part&#xff01;今…

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷&#xff08;四&#xff09; 第一部分&#xff1a;网络平台搭建与设备安全防护任务书第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&#xff1a;应急响应&…

单片机的串口(USART)

Tx - 数据的发送引脚&#xff0c;Rx - 数据的接受引脚。 串口的数据帧格式 空闲状态高电平&#xff0c;起始位低电平&#xff0c;数据位有8位校验位&#xff0c;9位校验位&#xff0c;停止位是高电平保持一位或者半位&#xff0c;又或者两位的状态。 8位无校验位传输一个字节…

动态规划(背包问题)--是否逆序使用的问题--二进制拆分的问题

动态规划&#xff08;背包问题&#xff09; 题目链接01背包代码 完全背包问题代码 多重背包问题 I代码 什么时候适用逆序多重背包问题 II&#xff08;超百万级的复杂度&#xff09;代码 关于二进制拆分 题目链接 01背包 代码 #include <iostream> #include <vector&…