python正则默认不跨行匹配,需用re.dotall使.匹配换行符、re.multiline使^/$匹配每行首尾;二者可组合为(?sm)实现灵活跨行匹配。

Python正则默认不跨行匹配,想让 . 匹配换行符、或让 ^/$ 匹配每行首尾,需启用特定标志:主要是 re.DOTALL(让 . 匹配换行符)和 re.MULTILINE(让 ^ 和 $ 行锚点作用于每行)。
re.DOTALL:让点号“.”匹配换行符
默认情况下,. 匹配除换行符(\n)外的任意字符。启用 re.DOTALL 后,. 也能匹配 \n,适合匹配多行文本中跨度较大的内容。
- 等价写法:
re.DOTALL、re.S或在模式字符串中加(?s) - 示例:
re.search(r'a.b', 'a\nb', re.DOTALL)能匹配成功;不加则失败 - 注意:
re.DOTALL不影响^/$的行为——它们仍只匹配整个字符串首尾
re.MULTILINE:让 ^ 和 $ 按行匹配
默认时,^ 只匹配整个字符串开头,$ 只匹配整个字符串结尾。启用 re.MULTILINE 后,^ 还能匹配每个换行符后的起始位置,$ 还能匹配每个换行符前的位置。
- 等价写法:
re.MULTILINE、re.M或在模式中加(?m) - 示例:
re.findall(r'^\d+', '123\n456\n789', re.MULTILINE)返回['123', '456', '789'] - 注意:
re.MULTILINE不改变.的行为——它依然不匹配换行符
两者组合使用:真正实现灵活跨行匹配
实际处理多行文本(如日志、HTML 片段、配置块)时,常需同时启用两个标志:既让 . 跨换行,又让 ^/$ 定位每行边界。
立即学习“Python免费学习笔记(深入)”;
- 推荐写法:
re.search(r'(?sm)^start.*?end$', text)——(?sm)同时开启 DOTALL 和 MULTILINE - 等效写法:
re.search(r'^start.*?end$', text, re.DOTALL | re.MULTILINE) - 常见误区:只用
re.MULTILINE却期望.*?跨行匹配,结果因.不含\n而失败
小技巧:内联标志更清晰、更局部
相比全局传 flag,用 (?i)、(?m)、(?s) 等内联标志更精准,且只对当前括号内子模式生效。
-
(?sm)pattern:仅该 pattern 启用 DOTALL + MULTILINE -
(?m)^abc$:仅此处的^/$按行匹配,不影响其余部分 - 可嵌套:
(?m)^abc(?s).*?def$表示按行找以 abc 开头、def 结尾的跨行块










