Python Regex 匹配时引用每组首行标题直到新分组的实现问题
该需求完全可以通过Python正则实现,核心思路是先按标题匹配出完整的独立块,再对每个块内的行做处理,避免跨块引用失效。
正确正则与匹配逻辑
使用的正则表达式为:^This is (?P<header>Header[A-Z])\n(?P<lines>(?:\s+Line\s+\d+\n?)*)
需要搭配re.MULTILINE标志使用,作用是让^可以匹配每一行的开头,把每个标题和其下属的所有行作为一个完整的匹配块捕获,避免不同标题的内容混淆。
完整可运行代码
import re text = """This is HeaderA Line 1 Line 2 Line 3 Line 4 Line 5 This is HeaderB Line 1 Line 2 """ pattern = re.compile(r"^This is (?P<header>Header[A-Z])\n(?P<lines>(?:\s+Line\s+\d+\n?)*)", re.M) result = [] for match in pattern.finditer(text): header = match.group("header") # 提取当前块下所有行的数字 line_nums = re.findall(r"Line\s+(\d+)", match.group("lines")) # 按要求用不同分隔符拼接 if header == "HeaderB": current_block = ", ".join([f"{header}{num}" for num in line_nums]) else: current_block = " ".join([f"{header}{num}" for num in line_nums]) result.append(current_block) # 输出结果,块之间空一行 print("\n\n".join(result))
输出结果
HeaderA1 HeaderA2 HeaderA3 HeaderA4 HeaderA5 HeaderB1, HeaderB2
原有正则问题说明
- 第一个正则仅捕获了单次Line匹配,没有批量捕获下属所有行,因此只能拿到第一个L值
- 第二个正则将header组设为可选,匹配时没有绑定块范围,跨块后捕获组的值会丢失,自然无法引用到对应的header
内容的提问来源于stack exchange,提问作者Jmgbnt
相关产品推荐
相关产品推荐

