Python 如何从格式固定的题库中提取多选题
有 500 多条这样的题目,现在想从里面把多选题提取出来,奈何等级不够,完不成这个想法。
[开始] 多选题(分值=2 分;答案=ABC ;难度=难度题)
以下关于生成树协议原理的描述正确的是( )
A、从网络中所有的交换机中,选出一个作为根交换机( Root )
B、计算本交换机到根交换机的最短路径
C、对每个 LAN,选出离根交换机最近的那个交换机作为指定交换机,负责此 LAN 上的数据
转发
D、非根交换机会选择若干个根端口,这些根端口给出的路径是此交换机到根交换机的最佳
[结束]
[开始] 多选题(分值=2 分;答案=AE ;难度=基础题)
在 STP 协议中,下面哪些因素会影响根交换机的选举( )
A、交换机优先级
B、交换机端口 ID
C、交换机接口带宽
D、交换机的 IP 地址
E、交换机的 MAC 地址
[结束]
[开始] 单选题(分值=2 分;答案=A ;难度=水平题)
IP 头中的 TTL 字段设置了数据包可以经过的路由器数目。 一旦经过一个路由器,TTL 值
就会减 1, 当该字段值为( )时,数据包将被丢弃。
A、0
B、1
C、-1
D、2
[结束]
因为单选题的格式固定,只有四个选项,现在只能把单选题提取了出来
IP 头中的 TTL 字段设置了数据包可以经过的路由器数目。 一旦经过一个路由器,TTL 值
就会减 1, 当该字段值为 [ 0 ] 时,数据包将被丢弃。
多选题试了好久一直不成功,请教熟悉 Python 的 V 友可否给一个思路,谢谢
Python 如何从格式固定的题库中提取多选题
11 回复

我来写个代码示例,直接从固定格式的题库文本中提取多选题。
import re
def extract_multiple_choice_questions(text):
"""
从固定格式的题库文本中提取多选题
参数:
text: 包含多选题的文本字符串
返回:
list: 提取出的多选题列表,每个题目是一个字典
"""
# 定义多选题的正则表达式模式
# 假设格式为:题号. 题目内容\nA. 选项A\nB. 选项B\nC. 选项C\nD. 选项D\n答案:ABCD
pattern = r'(\d+)\.\s*(.*?)\nA\.\s*(.*?)\nB\.\s*(.*?)\nC\.\s*(.*?)\nD\.\s*(.*?)\n答案:\s*([ABCD]+)'
questions = []
matches = re.findall(pattern, text, re.DOTALL)
for match in matches:
question = {
'number': match[0],
'content': match[1].strip(),
'options': {
'A': match[2].strip(),
'B': match[3].strip(),
'C': match[4].strip(),
'D': match[5].strip()
},
'answer': list(match[6]) # 将答案字符串转换为列表,如 ['A', 'B', 'C']
}
questions.append(question)
return questions
# 示例题库文本
sample_text = """
1. Python中哪些是可变数据类型?
A. 列表
B. 元组
C. 字典
D. 集合
答案:ACD
2. 以下哪些是Python的关键字?
A. def
B. class
C. import
D. print
答案:ABC
3. 哪些方法可以用于字符串拼接?
A. +
B. join()
C. format()
D. concat()
答案:ABC
"""
# 提取多选题
questions = extract_multiple_choice_questions(sample_text)
# 打印提取结果
for q in questions:
print(f"题号: {q['number']}")
print(f"题目: {q['content']}")
print("选项:")
for key, value in q['options'].items():
print(f" {key}. {value}")
print(f"答案: {q['answer']}")
print("-" * 40)
如果题库格式不同,可以调整正则表达式。比如有的题库可能用括号标注答案:
def extract_multiple_choice_variant(text):
"""处理变体格式:答案在选项后标注,如 A(√)"""
pattern = r'(\d+)\.\s*(.*?)\nA[\.、]?\s*(.*?)\s*[((]?[√对][))]?\nB[\.、]?\s*(.*?)\s*[((]?[√对][))]?\nC[\.、]?\s*(.*?)\s*[((]?[√对][))]?\nD[\.、]?\s*(.*?)\s*[((]?[√对][))]?'
# 这里需要根据具体格式调整匹配逻辑
# 主要是提取题目内容和正确答案
核心就是根据你的题库具体格式写对应的正则表达式来匹配和提取。
正则表达式要匹配你的具体格式。
#1 哈!你哈,请问这个是什么软件啊?看着比自带的 IDLE 高级好多。还有就是有没有办法将答案也加进题目中去呢?
就像这样
在 STP 协议中,下面哪些因素会影响根交换机的选举 [交换机优先级],[交换机的 MAC 地址]
谢谢!
合理安排你的正则匹配顺序,如果你能写出 nb 的能一步到位的正则就更好了
#2 单选题的话我是将一个完整的题目和答案提取出来,然后慢慢匹配。到多选题的时候有的题目会有 5 个选项,这样就不会了 
#4 正则不太熟,我用 split() 和 count() 慢慢匹配的,看来要去学正则表达式了 
那是 ipython
会不会是 spyder ? ipy 颜色好像没这么鲜艳吧
是 IPython,只不过终端配色用的 Ura。https://github.com/Mayccoll/Gogh/blob/master/content/themes.md#ura
spyder 用的不就是 IPython 吗?


