广告

Python正则入门指南:全面掌握re模块的用法与实战技巧

Python 正则入门与 re 模块概览

正则表达式的基础概念

在字符串处理中,正则表达式通过描述一个或多个字符的模式来实现快速匹配。对于新手而言,理解 模式、字符类、量词 是入门的关键。掌握这些要素后,可以把复杂的文本规则转化为简洁的模式,从而提升清洗和解析的效率。

此外,使用 原始字符串 r'...' 能避免大量的转义问题,使得 转义序列 的书写更加直观。常见的字符类如 \d\w\s 等在实际匹配中扮演着重要角色,理解它们的含义有助于快速构建正则模式。

import re
text = "号码是 987654"
pattern = r"\d+"
print(re.findall(pattern, text))

re 模块的核心接口与工作流程

在 Python 中,re 模块提供通过 compile 将模式编译成 pattern 对象,再使用 matchsearchfindallfinditer 等方法完成匹配。使用 pattern 对象 可以在重复任务中提升性能。

通过示例可以清晰看到工作流程:先用 compile 生成一个可复用的模式对象,然后利用各类方法完成不同的匹配需求。下面的代码展示了一个邮箱类模式的应用场景。

import re
pat = re.compile(r"(\\w+@\\w+\\.com)")
text = "请联系 hello@example.com 进行测试"
m = pat.search(text)
if m:
    print("找到邮箱:", m.group())

re 模块的核心函数与用法

查找与定位方法:match、search、findall、finditer

match 仅在字符串起始处进行匹配,因此对整段文本的起始位置有严格要求;search 可以在整个文本中进行搜索,返回第一个匹配的位置;findall 会返回所有匹配的列表;finditer 提供一个迭代器,可以逐个处理匹配对象。这些方法覆盖了从快速检查到全面提取的多种场景。

在实际使用中,选择 matchsearchfindallfinditer 的理由通常取决于需要的粒度和性能要求。以下示例演示了它们的基本差异与输出。

import re
text = "foo 123 bar 456"
print(re.match(r"foo", text))          # 仅在开头匹配
print(re.search(r"\\d+", text).group()) # 找到第一个数字序列
print(re.findall(r"\\d+", text))      # 找到所有数字
for m in re.finditer(r"\\d+", text):
    print("位置:", m.span(), "值:", m.group())

替换、分割与分组:sub、split、groups

使用 sub 可以对文本进行替换操作,split 用于按照模式将字符串拆分,分组 则帮助把需要的子模式提取出来并命名。掌握这些功能后,可以在数据清洗、日志分析等任务中实现高效的文本处理。

下面的示例展示了替换、拆分和分组的综合用法,适合快速实现文本结构转换与信息提取。

import re
s = "name: Alice; age: 30"
# 替换年龄为占位符
print(re.sub(r"age:\\s*\\d+", "age: XX", s))
# 拆分字符串
parts = re.split(r";\\s*", s)
print(parts)

# 使用分组提取
m = re.search(r"name:\\s*(\\w+)", s)
print("昵称:", m.group(1) if m else None)

正则表达式高级技巧与实战案例

分组与命名分组(?P<name>)

分组不仅用于提取信息,还可以通过 命名分组 让字段含义更加清晰,(?P<name>) 形式的分组可以通过 group('name') 直接访问,提升代码可读性与维护性。

在结构化文本解析或者需要将提取结果传递给后续处理时,命名分组往往是更友好的选择。通过命名分组,可以避免记忆分组序号带来的混淆。

import re
text = "日期: 2025-08-23"
m = re.search(r"(?P\\d{4})-(?P\\d{2})-(?P\\d{2})", text)
print(m.group('year'), m.group('month'), m.group('day'))

贪婪与非贪婪匹配、边界锚点

理解 贪婪非贪婪 的差异,可以直接影响匹配的结果与性能。结合锚点如 ^$、以及单词边界 \\b,可以实现对文本边界的精准控制。

通过非贪婪量词和锚点的搭配,可以在一行文本中提取到最小符合条件的子串,避免获取过长的匹配结果,同时提升匹配速度。

import re
text = "abc123xyz"
# 非贪婪匹配示例
m = re.search(r".*?123", text)
print("匹配结果:", m.group() if m else None)

# 锚点示例
line = "start end"
print(bool(re.match(r"^start", line)))
广告

后端开发标签