re.m(或re.multiline)是python正则表达式中用于改变^和$行为的标志,其作用在于让^匹配每一行的起始位置,让$匹配每一行的结束位置。默认情况下,^和$仅分别匹配整个字符串的开头和结尾;启用re.m后,它们将分别匹配每行的开头和换行符之前的位置。例如,在提取每行以特定字符开头的内容时,使用re.findall(r'^\w+', text, re.m)可匹配所有行首的单词。在删除注释行的场景中,通过re.sub(r'^\s*#.*$', '', config, flags=re.m)可过滤掉以#开头的行。使用时需注意:并非所有情况都需要re.m,它可与其他标志如re.i组合使用,且应避免盲目使用^和$导致误匹配。
在使用 Python 正则表达式处理多行文本时,很多人会发现 ^ 和 $ 只匹配整个字符串的开头和结尾,而不是每一行的开头和结尾。这其实是因为默认情况下,正则表达式是“整段匹配”的。要实现按行匹配,关键在于使用 re.M(或 re.MULTILINE)标志。
re.M 是正则表达式的一个可选标志,全称是 re.MULTILINE,它改变了 ^ 和 $ 的行为:
默认情况下:
立即学习“Python免费学习笔记(深入)”;
启用 re.M 后:
举个例子:
import re text = "abc\n123\nxyz" # 不带 re.M print(re.findall(r'^\w+', text)) # 输出: ['abc'] # 带 re.M print(re.findall(r'^\w+', text, re.M)) # 输出: ['abc', '123', 'xyz']
可以看到,启用 re.M 后,^\w+ 成功匹配了每一行的开头。
比如你有一段日志文件内容,每行都以 [INFO] 或 [ERROR] 开头,你想提取所有这些行:
log = """[INFO] User logged in [ERROR] Database connection failed [INFO] Cache cleared [WARNING] Low memory""" matches = re.findall(r'^$$.*?$$.*', log, re.M) print(matches) # 输出: ['[INFO] User logged in', '[ERROR] Database connection failed', ...]
这里的关键就是 ^$$.*?$$.* 中的 ^ 在 re.M 下能识别每行的开始。
有时候你想过滤掉配置文件中的注释行:
config = """# This is a comment server = localhost #port = 8080 debug = True""" cleaned = re.sub(r'^\s*#.*$', '', config, flags=re.M) print(cleaned.strip()) # 输出: # server = localhost # debug = True
注意这里用了 \s* 来跳过可能存在的空格,然后匹配 # 到行尾的所有内容。
示例:混合使用多个标志
text = "Start of line\nSTART again" matches = re.findall(r'^start', text, re.M | re.I) print(matches) # 输出: ['Start', 'START']
基本上就这些。掌握好 re.M 的使用,能让你更灵活地处理多行文本,尤其是在解析日志、配置文件或代码片段时非常实用。
以上就是Python正则表达式如何实现多行匹配?re.M用法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号