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

news/2025/2/26 17:59:56/

文章目录

    • 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 模块使用样例如下:

python">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() 方法获取。

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

2.2 命名分组

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

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

2.3 非贪婪匹配

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

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

2.4 零宽断言

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

  • 正向先行断言:(?=…),匹配后面是 … 的位置。
  • 负向先行断言:(?!..),匹配后面不是 … 的位置。
  • 正向后行断言:(?<=…),匹配前面是 … 的位置。
  • 负向后行断言:(?<!..),匹配前面不是 … 的位置。
python">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 对象,以提高效率。

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

2.6 转义字符

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

3. 常见应用场景

3.1 验证邮箱格式

python">import redef validate_email(email):pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'return re.match(pattern, email) is not Noneprint(validate_email('test@example.com'))  # 输出: True
print(validate_email('invalid-email'))    # 输出: False

3.2 提取 URL

python">import retext = '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 提取日期

python">import retext = '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属性。

python">import rehtml = """
<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属性。

python">import rehtml = """
<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字符串,想要提取其中的某个字段,可以使用正则表达式来匹配。

python">import rejson_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.ppmy.cn/news/1575062.html

相关文章

【Qt】可爱的窗口关闭确认弹窗实现

文章目录 ​​​实现思路界面构建交互逻辑实现颜色渐变处理圆形部件绘制 代码在主窗口的构造函数中创建弹窗实例ExitConfirmDialog 类代码ColorCircleWidget 类代码 今天在Qt实现了这样一个可互动的窗口&#xff08;上图由于录屏工具限制没有录制到鼠标&#xff09; ​​​实现…

Spring框架基本使用(Maven详解)

前言&#xff1a; 当我们创建项目的时候&#xff0c;第一步少不了搭建环境的相关准备工作。 那么如果想让我们的项目做起来方便快捷&#xff0c;应该引入更多的管理工具&#xff0c;帮我们管理。 Maven的出现帮我们大大解决了管理的难题&#xff01;&#xff01; Maven&#xf…

R语言安装教程(附安装包)R语言4.3.2版本安装教程

文章目录 前言一、安装包下载二、R-4.3.2安装步骤三、rtools43安装步骤四、RStudio安装步骤 前言 本教程将详细、全面地为你介绍在 Windows 系统下安装 R 语言 4.3.2 的具体步骤。无论你是初涉数据领域的新手&#xff0c;还是希望更新知识体系的专业人士&#xff0c;只要按照本…

zookeeper 客户端常用命令

ZooKeeper 是一个分布式协调服务&#xff0c;它的客户端命令行工具&#xff08;zkCli.sh 或 zkCli.cmd&#xff09;提供了一系列常用命令&#xff0c;用于操作和管理 ZooKeeper 服务中的数据节点&#xff08;ZNode&#xff09;。以下是对 ZooKeeper 客户端常用命令的简要介绍&a…

从零实现机器人自主避障

1. 编译工具安装 sudo apt update sudo apt install python3-catkin-pkg python3-rosdep python3-rosinstall-generator python3-wstool python3-rosinstall build-essential sudo rosdep init rosdep update2. 构建节点 mkdir -p ~/ros2_ws/src cd ~/ros2_ws ros2 pkg creat…

STM32 最小系统

STM32 最小系统 最小系统就是保证 MCU 正常运行的最低要求&#xff0c;一般是指 MCU 的供电、复位、晶振、BOOT 等部分。 最小系统需求如表&#xff1a;F407/F103最小系统都是一样的

山东大学软件学院nosql实验一环境配置

环境&#xff1a;前端vue后端springboot 软件环境&#xff1a; MongoDB MongoDBCompass 实验步骤与内容&#xff1a; 在官网下载安装包&#xff08;最新版&#xff09; 配置环境环境变量 在“高级系统设置-环境变量”中&#xff0c;可以将MongoDB添加到环境变量Path中(D:\…

[前端] 学习内容总结,css样式居中以及点击包裹a标签的容器元素也能触发a标签的点击事件

一、Css样式居中 1.1、用flex布局来使子元素居中 flex中justify-content是指定子元素在主轴上的对齐方式&#xff1b;align-items是子元素在交叉轴上的对齐方式。 所以我们可以通过设定这两个属性为居中来使子元素居中。 .navbar {display: flex; //flex 布局justify-conten…