re 模块:search、match、findall、sub
使用 re.search()、re.match()、re.findall()、re.sub() 和 re.compile() 提升性能
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 firstre.search — 查找任意位置
re.search(pattern, text) 会扫描整个字符串,查找第一个匹配项,并返回一个匹配对象;如果没有匹配项,则返回 None。
import re
m = re.search("\d+", "order 42 shipped")
if m:
print(m.group()) # "42"
print(m.start()) # 6re.match — 从开头锚定匹配
re.match 只会在字符串的开头进行匹配。如果模式不在位置 0,即使它稍后出现在字符串中,也会返回 None。
import re
print(re.match("\d+", "42 items")) # matches "42"
print(re.match("\d+", "items 42")) # Nonesearch 与 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 反馈 — 无需本地设置。
此课程中的所有课时
- 正则表达式模式与字符类
- re 模块:search、match、findall、sub
- 捕获组与命名组
- 使用正则表达式清理人工智能文本