如何用Python正则提取Word文档中结构化试题内容
解决Word/TXT文件中提取结构化单项选择题的问题
嘿,我来帮你搞定这个提取选择题的难题!你之前用docx和re库的思路完全没问题,只是可能在文本提取和正则匹配的细节上没处理到位。下面我给你一套完整的实现方案,分Word和TXT两种情况来讲解:
核心思路
我们需要先把文件里的所有文本完整提取出来,再用正则表达式精准匹配每一道从题号开始到[QuestionType]结束的内容,最后把匹配到的结果存入列表,每一项就是一道独立的题目。
一、处理Word文件(用python-docx库)
首先确保你已经安装了依赖库:
pip install python-docx
完整代码示例:
import docx import re def extract_questions_from_docx(docx_path): # 读取Word文档,提取所有段落文本 doc = docx.Document(docx_path) full_text = [] for para in doc.paragraphs: # 跳过空段落(避免多余的换行干扰匹配) if para.text.strip(): full_text.append(para.text) # 把所有段落拼接成带换行的字符串,保留题目原本的结构 full_text_str = '\n'.join(full_text) # 正则匹配规则:适配数字题号(比如1.、2.)的题目 # 如果你题号是其他格式(比如1、第一题),可以修改正则的开头部分 pattern = re.compile(r'(\d+\..*?\[QuestionType\])', re.DOTALL) # re.DOTALL让.可以匹配换行符,确保跨段落的题目也能被完整抓取 questions = pattern.findall(full_text_str) return questions # 调用示例 if __name__ == "__main__": docx_file = "你的题目文件.docx" extracted_questions = extract_questions_from_docx(docx_file) # 打印提取结果 for i, question in enumerate(extracted_questions, 1): print(f"第{i}道题:\n{question}\n{'='*50}")
二、处理TXT文件
TXT文件的处理更简单,直接读取全部内容即可,正则规则和上面一致:
import re def extract_questions_from_txt(txt_path): # 读取TXT文件内容 with open(txt_path, 'r', encoding='utf-8') as f: full_text_str = f.read() # 同样的正则匹配规则 pattern = re.compile(r'(\d+\..*?\[QuestionType\])', re.DOTALL) questions = pattern.findall(full_text_str) return questions # 调用示例 if __name__ == "__main__": txt_file = "你的题目文件.txt" extracted_questions = extract_questions_from_txt(txt_file) for i, question in enumerate(extracted_questions, 1): print(f"第{i}道题:\n{question}\n{'='*50}")
关键细节说明
正则表达式的灵活调整:
- 如果你的题号是中文格式(比如
第一题、第二题),把正则开头改成(第\d+题.*?\[QuestionType\]) - 如果题号是
1、这种顿号格式,把\d+\.改成\d+、 .*?是非贪婪匹配,一定要用这个!不然会从第一题的题号直接匹配到最后一个[QuestionType],把所有题合并成一个
- 如果你的题号是中文格式(比如
Word文件的特殊情况:
- 如果你的Word里有表格、图片或者复杂格式,
python-docx提取的文本可能会丢失部分内容,这时候可以先把Word另存为TXT文件,再用TXT的处理方法更稳妥 - 要是必须直接处理复杂Word,也可以试试
pywin32库(仅Windows可用),它能更精准地提取带格式的文本
- 如果你的Word里有表格、图片或者复杂格式,
内容的提问来源于stack exchange,提问作者Sathish Kumar




