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*[((]?[√对][))]?'
    
    # 这里需要根据具体格式调整匹配逻辑
    # 主要是提取题目内容和正确答案

核心就是根据你的题库具体格式写对应的正则表达式来匹配和提取。

正则表达式要匹配你的具体格式。

没用过 Python,提供个思路吧,就是不停的正则。
先匹配符合“ [开始] 多选题* [结束] ”这样的,就可以分离多选与单选了
然后获取答案,每题都匹配“答案=*;”这样的,就能获取每题的答案
剩下的就好做了……

#1 哈!你哈,请问这个是什么软件啊?看着比自带的 IDLE 高级好多。还有就是有没有办法将答案也加进题目中去呢?
就像这样
在 STP 协议中,下面哪些因素会影响根交换机的选举 [交换机优先级],[交换机的 MAC 地址]
谢谢!

合理安排你的正则匹配顺序,如果你能写出 nb 的能一步到位的正则就更好了

#2 单选题的话我是将一个完整的题目和答案提取出来,然后慢慢匹配。到多选题的时候有的题目会有 5 个选项,这样就不会了

#4 正则不太熟,我用 split() 和 count() 慢慢匹配的,看来要去学正则表达式了

那是 ipython

会不会是 spyder ? ipy 颜色好像没这么鲜艳吧

spyder 用的不就是 IPython 吗?

回到顶部