如何利用映射字典从TXT文件中提取指定结构化数据?
解决方案:基于映射字典提取多格式TXT数据
核心思路
先统一文本格式消除大小写、空格差异,再通过映射字典的字段变体去匹配提取对应值,最后输出规整的结构化结果。
具体实现步骤(Python)
- 预处理文本
把读取的TXT内容统一转小写、合并多余空格,减少匹配时的格式干扰:
def preprocess_text(text): # 转小写+替换多空格为单空格+去除换行符 return ' '.join(text.lower().split())
- 优化映射字典
将所有字段变体统一转小写,避免大小写不匹配的问题:
# 补充完整你的映射字典,这里加入发票字段的变体示例 values_dict = { 'Customer Number': ['customer nr.', 'customer number', 'cus. nr.', 'cust no.'], 'Invoice Number': ['invoice nr.', 'inv. number', 'invoice no.', 'inv nr'], 'Order Number': ['order number', 'order nr', 'ord. no.', 'order no.'] } # 生成小写版的变体映射,方便后续匹配 lowercase_mapping = {key: [var.lower() for var in vars] for key, vars in values_dict.items()}
- 编写提取逻辑
遍历每个目标字段,用正则匹配变体字段与对应值(兼容字段: 值或字段 值的常见格式):
import re def extract_data(txt_content): processed_text = preprocess_text(txt_content) extracted = {} # 提取公司信息(假设公司名位于文本开头,且在第一个业务字段前,可根据实际调整正则) company_match = re.search(r'^([a-zA-Z0-9\s&.,]+)(?=\scustomer nr\.|\sinv\. number|\sorder number)', processed_text) if company_match: extracted['Company Name'] = company_match.group(1).strip().title() # 遍历提取各业务字段 for target_field, variants in lowercase_mapping.items(): for variant in variants: # 匹配字段后紧跟冒号/空格,捕获字母、数字、连字符组成的值 pattern = re.compile(rf'{re.escape(variant)}\s*:?\s*([a-zA-Z0-9-]+)') match = pattern.search(processed_text) if match: extracted[target_field] = match.group(1) break # 找到匹配变体后停止当前字段的遍历 return extracted
- 读取文件并输出结果
# 读取目标TXT文件 with open('invoice_sample.txt', 'r', encoding='utf-8') as f: txt_content = f.read() # 提取并打印规整结果 result = extract_data(txt_content) print("规整提取结果:") for key, value in result.items(): print(f"{key}: {value}")
示例输出
假设输入TXT内容为:
ABC Trading Co. Customer Nr.: 12345 Inv. Number: INV-7890 Order nr: ORD-678
运行后输出:
规整提取结果: Company Name: Abc Trading Co. Customer Number: 12345 Invoice Number: INV-7890 Order Number: ORD-678
注意事项
- 若字段值包含空格,可调整正则捕获组为
([\w\s-]+) - 针对表格类TXT,可先按行分割文本,逐行匹配变体字段
- 需根据实际业务场景扩展
values_dict中的字段变体,确保覆盖所有可能的表述
内容的提问来源于stack exchange,提问作者Selchuk Hadzhaahmed
相关产品推荐
相关产品推荐

