Python正则跨行匹配_multiline与dotall说明

6次阅读

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

Python 正则跨行匹配_multiline 与 dotall 说明

Python 正则默认不跨行匹配,想让 . 匹配换行符、或让 ^/$ 匹配每行首尾,需启用特定标志:主要是 re.DOTALL(让 . 匹配换行符)和 re.MULTILINE(让 ^$ 行锚点作用于每行)。

re.DOTALL:让点号“.”匹配换行符

默认情况下,. 匹配除换行符(n)外的任意字符。启用 re.DOTALL 后,. 也能匹配 n,适合匹配多行文本中跨度较大的内容。

  • 等价写法:re.DOTALLre.S 或在模式字符串中加 (?s)
  • 示例:re.search(r'a.b', 'anb', re.DOTALL) 能匹配成功;不加则失败
  • 注意:re.DOTALL 不影响 ^/$ 的行为——它们仍只匹配整个字符串首尾

re.MULTILINE:让 ^ 和 $ 按行匹配

默认时,^ 只匹配整个字符串开头,$ 只匹配整个字符串结尾。启用 re.MULTILINE 后,^ 还能匹配每个换行符后的起始位置,$ 还能匹配每个换行符前的位置。

  • 等价写法:re.MULTILINEre.M 或在模式中加 (?m)
  • 示例:re.findall(r'^d+', '123n456n789', 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 结尾的跨行块
text=ZqhQzanResources