Python re模块正则提取两固定词间多行内容分组的方法
问题根因
你之前的正则无法拿到所有分组的核心原因是Python标准库re模块的特性限制:被量词(+/*/{m,n})修饰的捕获组,只会存储最后一次匹配的内容,不会保留每次重复匹配的结果。所以哪怕加了gms标志,你写的((?P<value>[^\n]+)\n)+结构最终只会返回最后匹配到的content3行,前两行的匹配结果会被覆盖。
推荐实现方案
不要硬写单条正则强行一步匹配,分两步实现可读性、容错率最高,适配任意行数的中间内容:
- 先用非贪婪匹配截取出
Word1和Word2之间的整块文本 - 对截取出的文本做行拆分,过滤空行、去除每行首尾缩进空白,就能得到所有独立的content分组
代码实现如下:
import re # 待匹配样例文本 sample_text = """Word1 content1 content1 content1 content2 content2 content2 content3 content3 content3 Word2 """ # 第一步:提取两个标记之间的整块内容,re.S标志让.可以匹配换行 block = re.search(r"Word1(.*?)Word2", sample_text, flags=re.S).group(1) # 第二步:拆分多行、过滤空行、去除每行首尾空白 content_list = [line.strip() for line in block.splitlines() if line.strip()] print(content_list) # 输出:['content1 content1 content1', 'content2 content2 content2', 'content3 content3 content3']
补充:固定行数的纯正则写法
如果你确定Word1和Word2之间固定只有3行有效内容,也可以用纯正则单次匹配,但这种写法灵活度差,内容行数变化就会失效:
pattern = r"Word1\s*(?P<v1>[^\n]+)\n\s*(?P<v2>[^\n]+)\n\s*(?P<v3>[^\n]+)\s*Word2" res = re.search(pattern, sample_text) print(res.groups()) # 输出:('content1 content1 content1', 'content2 content2 content2', 'content3 content3 content3')
内容的提问来源于stack exchange,提问作者Jedi Knight
相关产品推荐
相关产品推荐

