re.findall()可一次性提取所有键值对,关键在于设计兼容单行与多行缩进的正则模式:单行用r'^(w+):s*(.+)$'配re.multiline;多行缩进值需捕获后续空白开头行,避免贪婪匹配,并注意清洗噪声及规避.不跨行等陷阱。

直接用 re.findall() 配合合适模式,就能一次性提取所有键值对,关键是设计能识别“键:值”结构、同时兼容换行缩进的正则。
匹配基本键值对(单行)
适用于形如 name: Alice、age: 30 这类每行一个键值对的文本:
- 使用
r'^(w+):s*(.+)$'模式,配合re.MULTILINE标志 -
^和$在多行模式下分别匹配每行开头和结尾 -
w+匹配字母数字下划线组成的键名,.+匹配冒号后非空内容 - 示例代码:
re.findall(r'^(w+):s*(.+)$', text, re.MULTILINE)
处理多行缩进值(关键场景)
当值跨多行且后续行以空格或制表符缩进时(如 Bioconductor VIEWS 文件),需让正则“吞下”缩进行:
- 核心思路:匹配键行后,捕获其后所有非键行(即不以非空白字符开头的行)作为值
- 推荐模式:
r'^([^\s][^:]*):\s*([^\n]*(?:\n[\s]+[^\n]*)*)' - 解释:
[^\s][^:]*确保键以非空白开头、不含冒号;(?:\n[\s]+[^\n]*)*非捕获组重复匹配缩进行 - 必须加
re.MULTILINE,否则^只匹配全文开头
健壮提取(带清理与容错)
真实文本常含多余空格、引号、逗号等噪声,建议在匹配后做轻量清洗:
- 键:用
.strip('"'')去除常见包围符号 - 值:用
.strip()清除首尾空白,必要时用.replace(' ', ' ').replace(' ', ' ')归一化空白 - 若某些行无冒号但属于上一个键的延续(如 YAML 风格),可先用
re.sub()预处理,把缩进行前缀替换为特殊标记再统一解析
避免常见陷阱
几个高频出错点要特别注意:
- 别用
.*匹配值——它会贪婪吃到下一个键,改用.*?或更精确的否定字符集(如[^\n]*) -
.默认不匹配换行符,跨行必须加re.DOTALL(即re.S),但此时^/$行为会变,通常只需re.MULTILINE - 键名含空格或特殊字符(如
build date:)时,\w+失效,应改用[^:\n]+并确保前面有非空白锚定











