使用正则表达式从Word文件提取数据并映射至DataFrame的问题
解决Word文件数据提取的关联与正则匹配问题
看起来你遇到的两个问题都挺典型的——交易与公司无法关联是因为你把所有文件的文本合并后全局提取,破坏了单文件内的公司-交易对应关系;正则匹配异常则是因为依赖固定换行、没处理好带冒号的字段格式。我来给你一步步解决:
核心问题分析
- 关联失效:你把所有docx的文本拼在一起后提取公司名和交易数据,相当于把所有公司的交易混在了一起,自然没法对应上哪家公司对应哪些交易。正确的做法应该是逐个处理每个文件,因为每个文件对应一家公司的多条交易。
- 正则问题:原正则里的
\n\n是硬编码的换行,但Word转文本后的换行/空格可能不稳定;另外Value (USD)*(.*?)没有处理冒号(比如实际字段可能是Value (USD):),导致匹配不到正确内容。
修复后的完整代码
import docx2txt import re import glob import pandas as pd # 初始化存储所有记录的列表 all_records = [] # 遍历每个Word文件 for file_path in glob.glob('D:/Projects/Word reader/*.docx'): # 提取当前文件的纯文本 file_text = docx2txt.process(file_path) # 1. 提取当前文件对应的公司名(处理灵活的空格/换行) company_match = re.search(r'Firm name:\s*(.*?)\s*Location', file_text, re.DOTALL) if not company_match: print(f"⚠️ 警告:文件{file_path}中未找到公司名,已跳过") continue company_name = company_match.group(1).strip() # 2. 提取当前文件内的所有交易记录(匹配每个交易块) # 假设交易块结构为:Deal name: xxx → ... → Value (USD): xxx → Client: xxx deal_pattern = re.compile( r'Deal name:\s*(.*?)\s*Date:\s*.*?\s*Value \(USD\):\s*(.*?)\s*Client:', re.DOTALL ) for deal_match in deal_pattern.finditer(file_text): deal_name = deal_match.group(1).strip() deal_value = deal_match.group(2).strip() # 处理无交易值的情况 if not deal_value: deal_value = "No Data" # 将当前交易与所属公司绑定,添加到记录列表 all_records.append({ "Company Name": company_name, "Deal Name": deal_name, "Deal Value": deal_value }) # 转换为你需要的DataFrame格式 df = pd.DataFrame(all_records) print(df)
代码关键改进点
- 逐个文件处理:每个文件对应一家公司,提取完公司名后,再在该文件内提取所有交易,确保交易和公司一一绑定。
- 灵活的正则匹配:
- 用
\s*替代固定的\n\n,适配Word转文本后可能出现的任意空格/换行。 - 明确匹配
Value (USD):里的冒号,避免因字段格式导致的匹配失败。 - 使用
re.DOTALL让.匹配换行符,确保能跨行提取交易块内容。
- 用
- 异常处理:如果某个文件找不到公司名,会给出警告并跳过,避免程序崩溃。
额外优化建议
- 如果交易块的字段顺序不固定(比如有的文件里Value在Date前面),可以拆分正则,先找到所有
Deal name的位置,再逐个提取对应的Value。 - 可以添加对
.doc文件的支持(比如使用textract库替代docx2txt)。 - 若交易数量较多,可以添加进度提示,方便跟踪处理状态。
内容的提问来源于stack exchange,提问作者Rositsa Ilieva
相关产品推荐
相关产品推荐

