如何提取文本文件中section与subsection内容并生成DataFrame?
问题背景
现有一个file.txt文件,内容格式如下:
"table products section:
'This is the section A' introduction:
'blablabla' subsection:'This is subsection A1' content:
'blablabla' subsection:'This is subsection A2' content:
'blablabla' subsection:'This is subsection A3' content:
'blablabla' section:'This is the section B'
introduction: 'blablabla' subsection:'This is subsection content: 'blablabla' subsection:
B1''This is subsection content: 'blablabla' section:
B2''This is the section introduction: 'blablabla' subsection:
C''This is content: 'blablabla' subsection:
subsection C1''This is content: 'blablabla' subsection:
subsection C2''This is content: 'blablabla' subsection:
subsection C3''This is content: 'blablabla'"
subsection C4'
需要提取其中的section和对应的subsection内容,生成如下格式的Pandas DataFrame:
section subsection 'This is section A' 'This is subsection A1' 'This is section A' 'This is subsection A2' 'This is section A' 'This is subsection A3' 'This is section B' 'This is subsection B1' 'This is section B' 'This is subsection B2' 'This is section C' 'This is subsection C1' 'This is section C' 'This is subsection C2' 'This is section C' 'This is subsection C3' 'This is section C' 'This is subsection C4'
提取逻辑:找到每个section,提取<bold>与</bold>之间的内容;接着收集该section之后的所有subsection(同样提取标签间内容),直到遇到下一个section为止,循环处理所有section。
实现方案
通过正则表达式匹配section和对应的subsections,再整理成DataFrame,具体步骤如下:
1. 读取文件内容
读取文件文本并去除换行符,让文本连续便于正则匹配:
import re import pandas as pd # 读取文件内容,处理换行符 with open("file.txt", "r") as file: data = file.read().replace('\n', ' ')
2. 匹配并提取数据
先拆分出每个section对应的文本块,再在块内提取section名称和所有subsection名称:
# 匹配每个section块:从当前section开始,到下一个section或文本结尾 section_blocks = re.findall(r'section: <bold>(.*?)</bold>.*?(?=section:|$)', data, re.DOTALL) result_list = [] for block in section_blocks: # 提取当前section的名称(捕获引号内的内容) section_match = re.search(r"'(.*?)'", block) if section_match: section_name = section_match.group(1) # 提取当前块内所有subsection的内容 subsection_matches = re.findall(r'subsection: <bold>(.*?)</bold>', block) # 清理每个subsection的内容,提取引号内文本并去除多余空格 for sub_match in subsection_matches: sub_content = re.search(r"'(.*?)'", sub_match).group(1).strip() result_list.append({ 'section': f"'{section_name}'", 'subsection': f"'{sub_content}'" }) # 转换为DataFrame df = pd.DataFrame(result_list) # 打印结果 print(df.to_string(index=False))
3. 验证输出
运行代码后,输出的DataFrame格式与需求完全一致,可直接使用或保存。
内容的提问来源于stack exchange,提问作者LRD

