re.findall()最省心,能一次扫描全文提取所有匹配项;re.search()适合找首个关键位置;re.finditer()适用于需精细控制每个匹配的场景。

直接用 re.findall() 最省心,它能一次扫完整个字符串,把所有匹配项全拎出来,不漏不重,也不受位置或边界干扰。
用 findall 提取全部匹配片段
这是最常用、最稳妥的方式。只要模式写对,它会自动遍历全文,返回所有符合的子串列表。
- 适合目标模式重复出现、且你想要全部结果的场景
- 不用关心匹配是否重叠或中间夹杂无关内容,无关文本天然被跳过
- 示例:提取所有形如
##a...#a##b...#b的块
import re
text = "foo##abar#a##bfoo#bbar##afoo#a##bbar#bfoobar"
pattern = r"##a.+?#a##b.+?#b"
results = re.findall(pattern, text)
print(results) # ['##abar#a##bfoo#b', '##afoo#a##bbar#b']
用 search 找第一个关键位置
当你只关心首次出现的位置,比如定位日志起始点、截取正文开头,re.search() 更轻量高效。
- 返回 Match 对象,可用
.start()、.end()获取坐标 - 配合
.group()可直接拿到匹配内容 - 若关键词后还需保留全部后续文本,可结合切片使用
match = re.search(r"\bbegin\b", text)
if match:
rest = text[match.end():].strip() # 从关键词后开始截取
用 finditer 遍历并获取上下文
需要精细控制每个匹配(比如记录行号、提取前后若干字符),re.finditer() 返回迭代器,比一次性生成大列表更省内存。
- 每个元素是 Match 对象,支持
.span()、.groupdict()等方法 - 适合处理超长日志或需逐个校验的结构化字段
- 可轻松扩展为“匹配行 + 下一行”或“前两行 + 当前行”的上下文提取
注意模式写法的几个关键点
正则效果好坏,一半取决于模式本身是否健壮:
- 用
.*?而非.*,避免贪婪匹配吞掉本该属于下一个匹配的内容 - 加
\b锚定单词边界,防止begin匹配到beginner里 - 对可能含空格或换行的部分,用
[\s\S]或(?s)模式开关替代. - 提前用
re.compile()编译复杂模式,多次使用时性能更稳











