本文介绍如何用 Python 的 re.findall 配合捕获组,精准提取被相同子串(如 __)包围的中间内容,避免返回冗余的边界字符。
本文介绍如何用 python 的 `re.findall` 配合捕获组,精准提取被相同子串(如 `__`)包围的中间内容,避免返回冗余的边界字符。
在字符串处理中,常需提取被特定分隔符(如双下划线 __、方括号 []、引号 "" 等)包裹的内部内容。若直接使用非贪婪匹配 __.*?__,re.findall 会返回
整个匹配项
(含边界),例如 ['__W500__'];而实际需求往往是仅获取中间部分——即 W500。
解决方法是使用
捕获组 (...)
:将目标内容用圆括号括起,re.findall 会自动返回捕获组中的内容(而非整个匹配),前提是模式中
至少存在一个捕获组
。
✅ 正确写法:
? 关键说明:
perl正则表达式学习手册pdf版
perl正则表达式学习手册pdf版,点击下载解压即可。想学习perl正则的朋友需要看。
下载
r'__(.*?)__' 中,__ 是字面量边界,(.*?) 是非贪婪捕获组,匹配任意字符(除换行符)零次或多次;
re.findall 检测到捕获组后,
只返回组内匹配内容
,自动忽略外围 __;
若需匹配多个独立段落(如 "__A__ and __B__"),该模式仍能正确返回 ['A', 'B'];
使用原始字符串 r'' 可避免反斜杠转义问题,推荐作为正则书写惯例。
⚠️ 注意事项:
若正则中无捕获组(如 re.findall('__.*?__', text)),结果将包含边界;
若需匹配嵌套结构(如 __a__b__ 中的 a__b),标准正则不适用,应改用 re.finditer 手动解析或专用解析器;
对大小写敏感场景,可添加标志 re.IGNORECASE,例如 re.findall(r'__(.*?)__', text, re.IGNORECASE)。
总结:掌握捕获组是精准提取定界内容的核心技巧——只需把想保留的部分放进 ( ),re.findall 就会为你“去壳取肉”。
import re
text = "/image/123.__W500__.png"
matches = re.findall(r'__(.*?)__', text) # 注意:(.*?) 是捕获组
print(matches) # 输出: ['W500']