
本文介绍如何利用正则表达式的捕获组精准提取两个相同边界标记(如 __)之间的内容,避免将边界本身包含在结果中。核心在于使用非贪婪匹配配合圆括号捕获组。
本文介绍如何利用正则表达式的捕获组精准提取两个相同边界标记(如 __)之间的内容,避免将边界本身包含在结果中。核心在于使用非贪婪匹配配合圆括号捕获组。
在处理类似 /image/123.__W500__.png 这样的字符串时,若目标是提取 __ 之间的真实内容(即 W500),直接使用 __.*?__ 会返回带边界的完整匹配(如 ['__W500__'])。正确做法是将待提取部分用圆括号包裹,形成捕获组,使 re.findall() 自动返回组内内容而非整个匹配串。
示例代码如下:
import re text = "/image/123.__W500__.png" matches = re.findall(r'__(.*?)__', text) # 注意:r'' 原始字符串更安全;(.*?) 是非贪婪捕获组 print(matches) # 输出: ['W500']
✅ 关键要点:
- __(.*?)__ 中,__ 是字面量边界,(.*?) 表示“尽可能少地匹配任意字符”,且因被括号包围,findall() 会仅返回该组内容;
- 若正则中含多个捕获组,findall() 将返回元组列表(如 r'(a)(b)' 匹配 'ab' → [('a', 'b')]),但单组时直接返回字符串列表;
- 推荐始终使用原始字符串(r'')定义正则,避免反斜杠转义问题;
- 若需匹配更通用的“首尾相同字符”(不限于 __),可改用 r'(.).*?\1'(\1 表示反向引用第一个捕获组),但注意该模式会匹配任意单字符起止(如 'aba'、'c123c'),且不适用于多字符边界(如 __)。
总结:要剥离固定边界、提取中间内容,优先采用「边界 + 捕获组 + 非贪婪量词」结构,简洁、高效、可读性强。











