re.dotall的作用是让正则中的点号.匹配包括换行符在内的所有字符。默认情况下,点号不匹配换行符,导致跨行匹配失败;使用re.dotall后,可实现对多行内容的一次性匹配。实际应用如提取配置块时需结合非贪婪模式,注意空白字符影响,并可通过[\s\s]*等技巧替代该标志以避免其副作用。常见问题包括忘记启用该标志、未用非贪婪模式及忽略前后空行。
在使用 Python 正则表达式处理多行文本时,经常会遇到需要“跨行匹配”的情况。比如你想匹配一段被换行打断的内容,或者想一次性匹配整个块信息。这时候,
就派上用场了。
什么是
?
默认情况下,正则中的点号
是不匹配换行符
的。也就是说,如果你有一段包含换行的文本,用
去匹配中间内容,它会在遇到换行时停下来。
而
标志的作用就是让点号
匹配包括换行在内的所有字符。
立即学习
“
Python免费学习笔记(深入)
”;
举个例子:
在这个例子里,如果没有
,
是无法匹配成功的,因为中间有换行;加上这个标志之后,就能顺利匹配整段内容。
实际使用场景:提取多行块内容
一个常见的用途是提取类似配置块、代码块或多行日志。例如,你想从一段文本中提取出某个特定段落,这段落可能跨越多行。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
假设你有如下文本:
你想提取两个
中间的内容,可以这样写:
这里用了非贪婪模式
来匹配中间内容,并且借助
让点号能匹配到换行。
其他需要注意的地方
只影响
的行为,不会改变其他元字符(如
、
)的行为。
如果你只想处理换行而不影响其他行为,也可以考虑用
这类技巧来替代
,这样也能跨行匹配,无需使用
。
多行匹配时,注意文本开头和结尾是否包含多余空行或符号,容易造成匹配失败。
常见问题:
忘记加
导致匹配不到跨行内容
没有使用非贪婪模式导致匹配范围过大
忽略了前后的空白字符或换行符
总结一下
是解决跨行匹配问题的一个简单有效手段。在处理多行文本、提取块状内容时非常实用。只要记住它的作用是让
能匹配换行符,再结合合适的正则写法,基本就可以应对大多数需求了。
基本上就这些,用起来不复杂但很容易忽略细节。
re.DOTALLre.DOTALL.\n.*re.DOTALL.import re
text = """Line one
Line two
Line three"""
pattern = re.compile(r"one.*three", re.DOTALL)
match = pattern.search(text)
if match:
print("Match found!")re.DOTALLone.*threeSome text before
---
This is a block
that spans multiple lines.
---
More text after---pattern = re.compile(r"---\n(.*?)\n---", re.DOTALL)
result = pattern.search(text)
if result:
print(result.group(1))(.*?)re.DOTALLre.DOTALL.\s\w[\s\S]*.*re.DOTALLre.DOTALLre.DOTALL.