如何从TXT解析特定文本块生成格式正确的Excel表格?
解决方案
1. 正则匹配逻辑重构
要解决文本块提取、ITEMNAME纳入、多行Description处理的问题,核心是先匹配完整的文本块,再在块内提取键值对:
块匹配正则
用于捕获以ITEMNAME开头、直到空白行或下一个块结束的完整内容:
block_pattern = re.compile( r'^(?P<ITEMNAME>.+?)\n' r'(?P<content>(?:.+\n)+?)' r'(?=\n|^ITEMNAME|\Z)', re.MULTILINE | re.DOTALL )
^(?P<ITEMNAME>.+?)\n:捕获开头的ITEMNAME行,作为单独分组(?P<content>(?:.+\n)+?):捕获块内剩余所有内容(非贪婪模式)(?=\n|^ITEMNAME|\Z):匹配终止条件——空白行、下一个ITEMNAME开头或文本结尾
键值对匹配正则
用于处理块内的键值对,支持多行Description:
kv_pattern = re.compile( r'(?P<key>\w+):\s*(?P<value>(?:(?!^\w+:|\n\n).)+)', re.MULTILINE | re.DOTALL )
(?P<key>\w+)::捕获键名(字母数字下划线组成)(?P<value>(?:(?!^\w+:|\n\n).)+):捕获值,直到遇到新的键(^\w+:)或空白行(\n\n),包含多行内容
2. 完整代码实现
基于pandas和re库的完整处理代码:
import re import pandas as pd def extract_items_to_excel(txt_file_path): # 读取文本文件 with open(txt_file_path, 'r', encoding='utf-8') as f: full_text = f.read() # 提取所有目标文本块 all_blocks = block_pattern.finditer(full_text) items_data = [] for block in all_blocks: # 提取ITEMNAME current_item = {'ITEMNAME': block.group('ITEMNAME').strip()} # 提取块内键值对 kv_matches = kv_pattern.finditer(block.group('content')) for match in kv_matches: key = match.group('key').strip() # 把多行值换成空格分隔,避免Excel单元格内换行混乱 value = match.group('value').strip().replace('\n', ' ') current_item[key] = value items_data.append(current_item) # 生成Excel文件 df = pd.DataFrame(items_data) df.to_excel('extracted_items.xlsx', index=False) print('提取完成,已生成extracted_items.xlsx') # 替换为你的TXT文件路径 extract_items_to_excel('source_data.txt')
3. 问题对应解决点
- 每个块对应一行Excel:先按块提取,每个块生成一个字典,最终列表转DataFrame时自然一行对应一个块
- ITEMNAME纳入字典:从块的开头直接捕获ITEMNAME,作为字典的第一个键值对
- 多行Description处理:键值对正则通过负向预查,确保值部分包含所有连续行,直到新键或空白行出现
内容的提问来源于stack exchange,提问作者jhollis67
相关产品推荐
相关产品推荐

