Learn AI with Python · 课时

re 模块:search、match、findall、sub

使用 re.search()、re.match()、re.findall()、re.sub() 和 re.compile() 提升性能

第 2 / 4 课13 个步骤

re 模块:search、match、findall、sub 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。

re 模块

Python 通过内置的 re 模块提供正则表达式功能。核心函数包括 search、match、findall 和 sub。

知道该使用哪个函数,就解决了一半问题。

import re   # always import it first

re.search — 查找任意位置

re.search(pattern, text) 会扫描整个字符串,查找第一个匹配项,并返回一个匹配对象;如果没有匹配项,则返回 None。

import re

m = re.search("\d+", "order 42 shipped")
if m:
    print(m.group())   # "42"
    print(m.start())   # 6

re.match — 从开头锚定匹配

re.match 只会在字符串的开头进行匹配。如果模式不在位置 0,即使它稍后出现在字符串中,也会返回 None。

import re

print(re.match("\d+", "42 items"))    # matches "42"
print(re.match("\d+", "items 42"))    # None

search 与 match

关键区别如下:

  • match — 模式必须从索引 0 开始
  • search — 模式可以出现在任意位置

大多数时候,您需要使用 search。只有在明确需要检查前缀时,才使用 match。

re.findall — 获取所有匹配项

re.findall 会将所有不重叠的匹配项以字符串形式放入列表中返回,而不是返回匹配对象。这非常适合提取任务。

import re

emails = re.findall("\w+@\w+\.\w+", "a@x.com and b@y.org")
print(emails)   # ["a@x.com", "b@y.org"]

使用分组的 findall

如果模式包含捕获分组,findall 返回的是捕获的部分,而不是完整匹配项,这是一个常见的意外情况。

这里的每个元组都包含区号和其余部分。

import re

print(re.findall("(\d{3})-(\d{4})", "555-1234 and 999-8765"))
# [("555", "1234"), ("999", "8765")]

re.finditer — 匹配对象

如果您需要获取每个匹配项的位置或分组,请使用 re.finditer。它会惰性地产生匹配对象,您可以对其进行迭代。

import re

for m in re.finditer("\d+", "a1 b22 c333"):
    print(m.group(), "at", m.start())

re.sub — 查找并替换

re.sub(pattern, replacement, text) 会将每个匹配项替换为替换字符串,并返回一个新字符串。

它是文本清理的基础工具,可用于屏蔽、规范化和剥离内容。

import re

clean = re.sub("\d+", "#", "Room 101 and 202")
print(clean)   # "Room # and #"

使用反向引用和函数的 sub

替换内容可以使用 \1 引用捕获的分组,也可以使用函数来实现动态逻辑。

import re

# Swap "first last" -> "last, first"
print(re.sub("(\w+) (\w+)", "\\2, \\1", "Ada Lovelace"))

# Function replacement: double each number
print(re.sub("\d+", lambda m: str(int(m.group()) * 2), "a1 b2"))

re.compile — 重用模式

当您需要多次使用某个模式(例如在循环中使用)时,re.compile 会将其构建一次,生成可重用的模式对象。这样速度更快,代码也更清晰。

import re

num = re.compile("\d+")
for line in ["a1", "b22", "c333"]:
    print(num.findall(line))

实用标志

标志会改变匹配行为:

  • re.IGNORECASE — 不区分大小写
  • re.MULTILINE — ^/$ 匹配每一行
  • re.DOTALL — . 也会匹配换行符
import re

print(re.findall("cat", "Cat CAT cat", re.IGNORECASE))
# ["Cat", "CAT", "cat"]

快速检查:search 与 findall

您需要获取文档中任意位置出现的所有电话号码组成的列表。

回顾:re 模块

现在您已经掌握了正则表达式的核心函数:

  • re.search — 查找任意位置的第一个匹配项(匹配对象)
  • re.match — 仅从开头进行匹配
  • re.findall — 返回所有匹配项的列表(分组会改变输出)
  • re.finditer — 返回带有位置的匹配对象
  • re.sub — 替换匹配项,可使用反向引用或函数
  • re.compile 和标志,用于重用和控制

下一步:捕获分组和命名分组。

免费开始

用 AI 导师学习 Python — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
53
课程
225

常见问题解答

「re 模块:search、match、findall、sub」课时是免费的吗?

是的 — 「re 模块:search、match、findall、sub」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。

「re 模块:search、match、findall、sub」这节课中我会学到什么?

使用 re.search()、re.match()、re.findall()、re.sub() 和 re.compile() 提升性能 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn AI with Python 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「re 模块:search、match、findall、sub」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn AI with Python 课中编写并运行代码吗?

能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 正则表达式模式与字符类
  2. re 模块:search、match、findall、sub
  3. 捕获组与命名组
  4. 使用正则表达式清理人工智能文本
← 返回 Learn AI with Python