You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式:如何将多行分组直到某字符串开头的行?

解决连续foo-bar行分组的正则方案

问题描述

我在Python中处理如下格式的文本文件:

CR INFO
CR INFO
Wed Aug 17

foo-bar name_10_Name-Child_test
foo-bar name_25_Name-out
foo-bar name_1000_Name-test_out

CR INFO
CR INFO
Wed Aug 17

foo-bar name_10_Name-Child_test
foo-bar name_25_Name-out
foo-bar name_1000_Name-test_out

我是正则表达式新手,希望将所有以foo-bar开头的连续行分组,例如第一组包含3行foo-bar内容,第二组包含日期下方的3行foo-bar内容。目前我使用的正则表达式为(^foo-bar\s+[A-z0-9-]+),搭配gm标志,但它会将每一行foo-bar单独分组,而非将连续行归为一组。请问如何实现将连续的foo-bar行分组,直到遇到以CR开头的行或空行?

解决方案

你可以使用以下正则表达式配合Python的re模块,直接捕获连续的foo-bar行组:

代码实现

import re

# 目标文本内容
text = """CR INFO
CR INFO
Wed Aug 17

foo-bar name_10_Name-Child_test
foo-bar name_25_Name-out
foo-bar name_1000_Name-test_out

CR INFO
CR INFO
Wed Aug 17

foo-bar name_10_Name-Child_test
foo-bar name_25_Name-out
foo-bar name_1000_Name-test_out
"""

# 编译正则表达式,启用多行模式
pattern = re.compile(r'^foo-bar\s+[\w-]+(?:\nfoo-bar\s+[\w-]+)*$', re.MULTILINE)
# 查找所有匹配的连续行组
groups = pattern.findall(text)

# 输出每组内容
for i, group in enumerate(groups, 1):
    print(f"第{i}组:")
    print(group)
    print("-" * 20)

正则表达式解释

  • ^foo-bar\s+[\w-]+:匹配单行以foo-bar开头的内容,[\w-]+匹配后续的字母、数字、下划线和连字符(比[A-z0-9-]+更准确,避免包含非字母符号)
  • (?:\nfoo-bar\s+[\w-]+)*:非捕获组,匹配零个或多个紧跟在第一行之后的foo-bar行(通过\n连接),实现连续行的分组
  • re.MULTILINE:让^匹配每行的开头,确保只捕获行首为foo-bar的内容

输出结果

运行代码后会得到两个分组,每个分组包含3行连续的foo-bar内容,完全符合需求。

内容的提问来源于stack exchange,提问作者knight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:06:25