如何从含重复嵌套模式的文本文件中提取指定内容?
推荐查阅的文档方向
1. Python re模块进阶文档
重点聚焦以下内容:
- 捕获组与命名组:用括号精准捕获Dataset名称、目标文件名、关键数据这三类核心内容,一次性从匹配结果中提取,省去额外循环筛选的麻烦。
- 正向预查(Lookahead):用来精准定位每个Dataset块的结束边界(下一个
[Dataset]或文本末尾),避免匹配跨块的无效内容。 re.VERBOSE模式:允许将复杂正则拆分为多行并添加注释,大幅提升可读性,适配这种多块嵌套的文本结构。re.finditer()方法:迭代返回每个匹配的Match对象,方便逐个处理每个Dataset对应的内容,比findall更灵活。
2. 第三方结构化解析库文档
如果正则编写过于复杂,推荐查看pyparsing的官方文档:
它支持自定义文本语法规则,你可以直接定义Dataset块、Filename块、KeyData块的格式,将整个文本解析为结构化的对象列表,直接按需求提取关联数据,完全替代繁琐的嵌套循环逻辑。
示例思路(基于正则)
你可以用包含多捕获组的正则,一次性匹配每个Dataset的完整块,直接提取所需内容:
import re with open('file.txt', 'r') as f: text = f.read() # 正则匹配每个Dataset块,捕获Dataset编号、目标文件名、关键数据 pattern = re.compile( r'\[Dataset (\d+)\]' # 匹配Dataset块开头 r'.*?' # 跳过中间无关内容 r'\[Filename (\d+)\]' # 捕获关键分隔符前的最后一个Filename r'.*?' # 跳过中间内容 r'\[Key Data Delimiter\] (!.*?) \[Key Data Delimiter\]' # 捕获关键数据 r'.*?' # 跳过块尾无关内容 r'(?=\[Dataset|\Z)', # 块结束标记:下一个Dataset或文本末尾 re.DOTALL | re.VERBOSE ) # 提取并格式化输出 for dataset_num, filename_num, key_data in pattern.findall(text): print(f"[Dataset {dataset_num}], [Filename {filename_num}], {key_data}.")
内容的提问来源于stack exchange,提问作者bonzoon
相关产品推荐
相关产品推荐

