Python re 模块:正则表达式的强大工具

devtools/2024/10/24 5:53:50/

文章目录

  • Python `re` 模块:正则表达式的强大工具
  • 导入 `re` 模块
  • 基本匹配方法
    • re.match()
    • re.search()
    • re.findall()
    • re.finditer()
  • 替换操作
    • re.sub()
  • 分割字符串
    • re.split()
  • 捕获组和非捕获组
    • 捕获组
    • 非捕获组
  • 常用模式符号
  • 实际应用示例
    • 验证电子邮件格式
    • 提取 URL
  • 预定义字符简介
    • 示例代码
      • 1. 匹配数字
      • 2. 匹配非数字字符
      • 3. 匹配空白字符
      • 4. 匹配字母数字字符
  • 性能考虑
  • 总结


Python re 模块:正则表达式的强大工具

正则表达式是处理字符串的强大工具,而 Python 的 re 模块为我们提供了灵活且高效的方式来使用正则表达式。本文将深入探讨 re 模块的常用功能和实际应用示例。

导入 re 模块

在使用正则表达式之前,首先需要导入 re 模块:

python">import re

基本匹配方法

re.match()

re.match() 从字符串的开始位置匹配一个模式。

python">pattern = r'\d+'
string = '123abc'match = re.match(pattern, string)
if match:print("匹配成功:", match.group())
else:print("匹配失败")

re.search()

re.search() 在整个字符串中搜索模式。

python">pattern = r'\d+'
string = 'abc123xyz'search = re.search(pattern, string)
if search:print("找到的匹配:", search.group())
else:print("没有找到匹配")

re.findall()

re.findall() 返回字符串中所有匹配的子串,以列表形式返回。

python">pattern = r'\d+'
string = 'abc123xyz456'matches = re.findall(pattern, string)
print("所有匹配:", matches)

re.finditer()

re.finditer() 返回一个迭代器,包含所有匹配的对象。

python">pattern = r'\d+'
string = 'abc123xyz456'for match in re.finditer(pattern, string):print("匹配到:", match.group(), "位置:", match.start())

替换操作

re.sub()

re.sub() 用于替换匹配的字符串。

python">pattern = r'\d+'
string = 'abc123xyz456'
result = re.sub(pattern, '#', string)
print("替换后的字符串:", result)

分割字符串

re.split()

re.split() 按照正则表达式分割字符串。

python">pattern = r'\d+'
string = 'abc123xyz456'
result = re.split(pattern, string)
print("分割后的结果:", result)

捕获组和非捕获组

捕获组

使用括号 () 来定义捕获组。

python">pattern = r'(\d+)-(\d+)-(\d+)'
string = '2024-10-23'match = re.match(pattern, string)
if match:print("年份:", match.group(1), "月份:", match.group(2), "日期:", match.group(3))

非捕获组

使用 (?:...) 来定义非捕获组。

python">pattern = r'(?:\d+)-(\d+)'
string = '2024-10'match = re.match(pattern, string)
if match:print("月份:", match.group(1))

常用模式符号

符号描述示例
.匹配除换行符外的任何字符a.b 匹配 acb, a1b
^匹配字符串的开头^abc 匹配 abcde
$匹配字符串的结尾xyz$ 匹配 abcxyz
*匹配 0 次或多次ab*c 匹配 ac, abc, abbc
+匹配 1 次或多次ab+c 匹配 abc, abbc 但不匹配 ac
?匹配 0 次或 1 次ab?c 匹配 acabc
{m,n}匹配 m 到 n 次a{2,4} 匹配 aa, aaa, aaaa
[]匹配字符集[abc] 匹配 a, b, c
``或运算符
()捕获组(abc) 捕获 abc
(?:...)非捕获组(?:abc) 不捕获 abc
\d匹配数字\d 匹配 0-9
\D匹配非数字\D 匹配 a-z
\w匹配字母、数字及下划线\w 匹配 a-z, A-Z, 0-9, _
\W匹配非字母、数字及下划线\W 匹配空格、标点等
\s匹配空白字符\s 匹配空格、制表符等
\S匹配非空白字符\S 匹配任何非空格字符

实际应用示例

验证电子邮件格式

python">def is_valid_email(email):pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'return re.match(pattern, email) is not Noneemail = 'test@example.com'
print("邮箱格式是否正确:", is_valid_email(email))

提取 URL

python">def extract_urls(text):pattern = r'https?://[^\s]+'return re.findall(pattern, text)text = "访问我们的官网 https://example.com 和 http://test.com"
urls = extract_urls(text)
print("提取的 URL:", urls)

预定义字符简介

符号描述相当于
\d匹配任何十进制数[0-9]
\D匹配任何非数字字符[^0-9]
\s匹配任何空白字符[\t\n\r\f\v]
\S匹配任何非空白字符[^\t\n\r\f\v]
\w匹配任何字母数字字符(包括下划线)[a-zA-Z0-9_]
\W匹配任何非字母数字字符(包括下划线)[^a-zA-Z0-9_]

示例代码

1. 匹配数字

使用 \d 匹配字符串中的数字:

python">import retext = "匹配规则这2个字符串3是否匹配规则5则则则7则"
matches = re.findall(r"\d", text)  # 匹配任何单个数字
print(matches)  # 输出: ['2', '3', '5', '7']

如果需要匹配一位或多位数字,可以使用 \d+

python">import retext = "匹配规则这2个字符串134444是否匹配规则5则则则7则"
matches = re.findall(r"\d+", text)  # 匹配一位或多位数字
print(matches)  # 输出: ['2', '134444', '5', '7']

2. 匹配非数字字符

使用 \D 匹配非数字字符:

python">import retext = "匹配规则这2个字符串3是否匹配规则5则则则7则"
matches = re.findall(r"\D", text)  # 匹配任何非数字字符
print(matches)  # 输出: ['匹', '配', '规', '则', '这', '个', '字', '符', '串', '是', '否', '匹', '配', '规', '则', '则', '则', '则', '则']

3. 匹配空白字符

使用 \s 匹配字符串中的空白字符:

python">import retext = "匹配规则   这2个字符串3是否匹\n配规则5则则则7则"
matches = re.findall(r"\s", text)  # 匹配任何空白字符
print(matches)  # 输出: [' ', ' ', ' ', '\n']

使用 \S 匹配非空白字符:

python">import retext = "匹配规则   这2个字符串3是否匹\n配规则5则则则7则"
matches = re.findall(r"\S", text)  # 匹配任何非空白字符
print(matches)  # 输出: ['匹', '配', '规', '则', '这', '2', '个', '字', '符', '串', '3', '是', '否', '匹', '配', '规', '则', '5', '则', '则', '则', '7', '则']

4. 匹配字母数字字符

使用 \w 匹配包括下划线在内的字母数字字符:

python">import retext = "https://www.cnblogs.com/"
matches = re.findall(r'\w', text)  # 匹配字母数字字符
print(matches)  # 输出: ['h', 't', 't', 'p', 's', 'w', 'w', 'w', 'c', 'n', 'b', 'l', 'o', 'g', 's', 'c', 'o', 'm']

使用 \W 匹配非字母数字字符:

python">import retext = "https://www.cnblogs.com/"
matches = re.findall(r'\W', text)  # 匹配非字母数字字符
print(matches)  # 输出: [':', '/', '/', '.', '.', '/']

性能考虑

在处理大量数据时,正则表达式的性能可能会受到影响。可以考虑以下优化策略:

  • 使用原始字符串(r'')来避免转义字符。
  • 避免复杂的表达式,尽量简化模式。
  • 使用编译后的正则表达式
python">compiled_pattern = re.compile(r'\d+')
matches = compiled_pattern.findall('abc123xyz456')
print("匹配结果:", matches)

总结

Python 的 re 模块为字符串处理提供了强大的正则表达式支持。通过掌握基本用法和实际应用,能够高效地处理复杂的字符串匹配和替换任务。掌握正则表达式的语法和方法,可以显著提升你的 Python 编程能力。


http://www.ppmy.cn/devtools/128377.html

相关文章

Qt中使用线程之QRunnable

1、自定义1个子类继承自QRunnable 2、重写run方法,编写子线程的业务逻辑 3、使用QThreadPool的全局方法来开启这个线程 4、线程的回收不需要关注,由QThreadPool处理 5、缺点:无法使用信号槽机制 6、适合一些不需要和主线程通信的耗时的任…

C#中的LINQ之美:优雅的数据查询与操作

LINQ(Language Integrated Query,语言集成查询)是C#中一个强大的工具,它将查询功能直接融入到语言中,使开发者能够以一种更直观、更接近自然语言的方式来操作数据。LINQ不仅能极大地提高开发效率,而且让代码…

欧盟 RED 网络安全法规 EN 18031

目录 1. 📂 EN 18031 1.1 背景 1.2 专业术语 1.3 覆盖产品范围 1.4 EN 18031标准主要评估内容: 1.5 EN 18031标准主要评估项目: 1.6 EN 18031 与 ETSI EN 303 645 的主要差异 1.7 RED 网络安全法规解读研讨会 2. 🔱 EN 1…

安全见闻(7)——开阔眼界,不做井底之蛙

内容预览 ≧∀≦ゞ 安全见闻七:洞悉硬件设备的安全风险声明导语硬件设备的安全问题物理安全问题设备被盗或损坏环境因素电磁干扰 供应链安全问题假冒伪劣产品恶意软件植入供应链中断 设备漏洞问题操作系统漏洞固件漏洞硬件设计漏洞 网络连接问题网络攻击无线连接安全…

Windows系统PyCharm右键运行.sh文件

在参考了Windows系统下pycharm运行.sh文件,执行shell命令_shell在pycharm-CSDN博客 和深度学习:PyCharm中运行Bash脚本_pycharm bash-CSDN博客 配置了右键执行.sh文件之后,发现在Windows的PyCharm中直接右键运行sh文件,存在如下…

LeetCode 110. 平衡二叉树

给定一个二叉树,判断它是否是平衡二叉树。 二叉平衡树的左右子树高度相差不超过1,且左右子树均是二叉平衡树二叉平衡树是所有结点的左右子树高度差均不超过1的二叉树 主要考对二叉平衡树的概念 # Definition for a binary tree node. # class TreeNod…

STMicroelectronics 意法半导体芯片选型表

意法半导体作为全球知名的半导体厂商,其产品广泛应用于各个领域,从消费电子到工业控制,从汽车电子到通信设备,都能看到意法半导体芯片的身影。在电子硬件设计领域,芯片的选型至关重要。亿配芯城(ICgoodFind…

2024软考网络工程师笔记 - 第8章.网络安全

文章目录 网络安全基础1️⃣网络安全威胁类型2️⃣网络攻击类型3️⃣安全目标与技术 🕑现代加密技术1️⃣私钥密码/对称密码体制2️⃣对称加密算法总结3️⃣公钥密码/非对称密码4️⃣混合密码5️⃣国产加密算法 - SM 系列6️⃣认证7️⃣基于公钥的认证 &#x1f552…