如何使用Python读取txt文件中的数据块并将其转换为结构化数据?

时间:2017-07-16 22:09:13

标签: python regex

最近我正在建立一个考试测试系统,现在我在txt文件中将问题和答案组织如下:

  

Q1

     

以下所有内容都是安全策略EXCEPT的基本组件   在

     

一个。问题的定义和相关术语的陈述。

     

B中。角色和责任声明。

     

℃。适用性和合规要求声明。

     

d。特征和要求的履行声明。

     

答案:D

     

解释:政策被认为是第一个和最高级别的文档,   从哪个标准,程序和方法的较低层次的元素   准则流程。但是,此订单并不意味着政策   比下层元素更重要。这些更高级别的政策,   应该创建哪些更一般的策略和语句   首先是出于战略原因,然后是更具战术性的   元素可以遵循。 -Ronald Krutz CISSP PREP指南(黄金版)   第13页

     

Q2

     

确保商业信息的完整性是主要关注点   的

     

一个。加密安全性

     

B中。程序安全。

     

℃。逻辑安全

     

d。在线安全

     

答案:B

     

解释:程序被视为政策链中的最低级别   因为它们最接近计算机并提供详细步骤   用于配置和安装问题。他们提供了步骤   实际上实现了政策,标准和中的陈述   准则......安全程序,标准,措施,做法和   政策涵盖了许多不同的主题领域。 - 肖恩哈里斯   一体化CISSP认证指南第44-45页

     

Q3

     

以下哪一项是一项重要特征   信息安全政策?

     

一个。确定信息的主要功能区域。

     

B中。量化信息丢失的影响。

     

℃。需要识别信息所有者。

     

d。列出支持业务功能的应用程序。

     

答案:A

     

解释:信息安全政策领域描述的高层计划   程序的目标。政策不是指导方针或标准,也不是   他们是程序或控制。策略一般描述安全性   条款,而不是具体细节。它们为整体提供了蓝图   安全程序就像规范定义您的下一个产品一样 -   Roberta Bragg CISSP认证培训指南(que)第206页

我想要做的是,我想将每个问题转换为结构化数据格式(您可以看到如下),以便我可以将它们存储在数据库中。

organized format

我想使用Python来完成这项任务,我有点知道我需要使用正则表达式来处理它,但我只是不知道该怎么做。

任何人都可以帮忙吗?非常感谢您的帮助!谢谢!

2 个答案:

答案 0 :(得分:0)

这可能超出你的需要 在它的默认状态下,它只需要

  • Q号
  • 问题
  • 回答
  • 说明

所以,你每场比赛得1分。

注意 - 您可以从评论的正则表达式中获取所需的组号。
而且,如果你想在 D 之外添加更多可能的选择,只需克隆一个并添加它 (请务必在排除类中添加该字母,即[ABCDEF..]

此外,这些大型和简单的正则表达式可以进行格式化/编辑/压缩/解析和弦乐化, 使用像regexformat.com这样的商业实用程序。  从好的方面来说,有一个免费试用版,可以无限制地解锁除保存到文件之外的所有内容。

这样你就可以把它放在它上面并在数据库中看到它们(占位符等等......) 稍后完成)

当然,它也处理所有已完成的记录。

https://regex101.com/r/TGkUyR/2

r'(?ms)^Q(\d+)\s*^((?:(?!^(?:[ABCD]\.[ ]|Answer:)).)*?)\s*(?:^A\.[ ][^\S\r\n]*((?:(?!^(?:[ABCD]\.[ ]|Answer:)).)*?)\s*)?(?:^B\.[ ][^\S\r\n]*((?:(?!^(?:[ABCD]\.[ ]|Answer:)).)*?)\s*)?(?:^C\.[ ][^\S\r\n]*((?:(?!^(?:[ABCD]\.[ ]|Answer:)).)*?)\s*)?(?:^D\.[ ][^\S\r\n]*((?:(?!^(?:[ABCD]\.[ ]|Answer:)).)*?)\s*)?^Answer:[ ]+([A-D]?)\s*^Explaination:[^\S\r\n]*((?:(?!^Q\d).)*?)\s*(?=(?:^Q\d|\Z))'

格式化/解释

 (?ms)                         # Modifiers: multi-line, dot-all

 ^ Q
 ( \d+ )                       # (1), Question Number  (required)
 \s*                           # wsp trim
 ^ 
 (                             # (2 start), The question  (required, but can be blank)
      (?:
           (?!
                ^ 
                (?: [ABCD] \. [ ] | Answer: )
           )
           . 
      )*?
 )                             # (2 end)
 \s*                           # wsp trim

 (?:
      ^ A\. [ ] [^\S\r\n]* 
      (                             # (3 start), A - choice (optional, and can be blank)
           (?:
                (?!
                     ^ 
                     (?: [ABCD] \. [ ] | Answer: )
                )
                . 
           )*?

      )                             # (3 end)
      \s*                           # wsp trim
 )?

 (?:
      ^ B\. [ ] [^\S\r\n]* 
      (                             # (4 start), B - choice  (optional, and can be blank)
           (?:
                (?!
                     ^ 
                     (?: [ABCD] \. [ ] | Answer: )
                )
                . 
           )*?

      )                             # (4 end)
      \s*                           # wsp trim
 )?
 (?:
      ^ C\. [ ] [^\S\r\n]* 
      (                             # (5 start), C  - choice  (optional, and can be blank)
           (?:
                (?!
                     ^ 
                     (?: [ABCD] \. [ ] | Answer: )
                )
                . 
           )*?

      )                             # (5 end)
      \s*                           # wsp trim
 )?
 (?:
      ^ D\. [ ] [^\S\r\n]* 
      (                             # (6 start), D - choice  (optional, and can be blank)
           (?:
                (?!
                     ^ 
                     (?: [ABCD] \. [ ] | Answer: )
                )
                . 
           )*?

      )                             # (6 end)
      \s*                           # wsp trim
 )?
 ^ Answer: [ ]+ 
 ( [A-D]? )                    # (7), Answer (required, but can be blank)

 \s*                           # wsp trim

 ^ Explaination: [^\S\r\n]* 
 (                             # (8 start), Explanation (required, but can be blank)
      (?:
           (?! ^ Q \d )
           . 
      )*?

 )                             # (8 end)
 \s*                           # wsp trim

 (?=                           # Lookahead for next record or EOS
      (?: ^ Q \d | \Z )
 )

答案 1 :(得分:0)

您可能会考虑的一个想法是,使用CSV或TSV等标准格式解析信息会更容易一些。

就个人而言,我发现一种基于正则表达式的解决方案来解析这种难以阅读的输入格式。现有的正则表达式答案写得很好,但只需要一个兽性正则表达式,所以它不是我个人选择解决这个特定问题的实现。我认为通过基于常见str函数(如split,replace和strip)解析逻辑来添加更简单的替代答案以删除换行符和样板文本将是有益的。

我认为使用自定义分隔符设置为'\n\n'的{​​{3}}也可以解决此问题,但是,无论出于何种原因,该函数仅支持1个字符的分隔符字符串。

您应该在此示例中添加一些内容,例如文件不存在时的异常处理,但核心是解决手头的问题。当然,你也不需要在课堂上封装,但这对我来说很自然。

class Question:

    def __init__(self, num, text, option_a, option_b, option_c, option_d,
                 answer, explanation):
        self.num = num
        self.text = text
        self.option_a = option_a
        self.option_b = option_b
        self.option_c = option_c
        self.option_d = option_d
        self.answer = answer
        self.explanation = explanation

    @classmethod
    def parse_input_file(cls, filename):
        """
        Parse an input file of questions delimited by double newline.

        Note: misspelling of "explanation" as "explaination" is intentionally
        preserved from asker's question.
        """
        with open(filename) as fp:
            data = fp.read()

        data = data.split('\n\n')

        questions = []
        for i in range(0, len(data), 8):
            question_data = data[i:i+8]
            question = cls(
                num=int(question_data[0].lstrip('Q')),
                text=question_data[1],
                option_a=question_data[2].lstrip('A.').strip(),
                option_b=question_data[3].lstrip('B.').strip(),
                option_c=question_data[4].lstrip('C.').strip(),
                option_d=question_data[5].lstrip('D.').strip(),
                answer=question_data[6].replace('Answer: ', '', 1),
                explanation=question_data[7].replace('Explaination: ', '', 1),
            )
            questions.append(question)

        return questions

有关使用它的示例:

from pprint import pprint

questions = Question.parse_input_file('questions.txt')
for i in questions:
    pprint(i.__dict__)

输出:

{'answer': 'D',
 'explanation': 'Policies are considered the first and highest level of '
                'documentation, from which the lower level elements of '
                'standards, procedures, and guidelines flow. This order, '
                'however, does not mean that policies are more important than '
                'the lower elements. These higher-level policies, which are '
                'the more general policies and statements, should be created '
                'first in the process for strategic reasons, and then the more '
                'tactical elements can follow. -Ronald Krutz The CISSP PREP '
                'Guide (gold edition) pg 13',
 'num': 1,
 'option_a': 'definition of the issue and statement of relevant terms.',
 'option_b': 'statement of roles and responsibilities.',
 'option_c': 'statement of applicability and compliance requirements.',
 'option_d': 'statement of performance of characteristics and requirements.',
 'text': 'All of the following are basic components of a security policy '
         'EXCEPT the'}
{'answer': 'B',
 'explanation': 'Procedures are looked at as the lowest level in the policy '
                'chain because they are closest to the computers and provide '
                'detailed steps for configuration and installation issues. '
                'They provide the steps to actually implement the statements '
                'in the policies, standards, and guidelines...Security '
                'procedures, standards, measures, practices, and policies '
                'cover a number of different subject areas. - Shon Harris '
                'All-in-one CISSP Certification Guide pg 44-45',
 'num': 2,
 'option_a': 'Encryption Security',
 'option_b': 'Procedural Security.',
 'option_c': 'Logical Security',
 'option_d': 'On-line Security',
 'text': 'Ensuring the integrity of business information is the PRIMARY '
         'concern of'}
{'answer': 'A',
 'explanation': 'Information security policies area high-level plans that '
                'describe the goals of the procedures. Policies are not '
                'guidelines or standards, nor are they procedures or controls. '
                'Policies describe security in general terms, not specifics. '
                'They provide the blueprints for an overall security program '
                'just as a specification defines your next product - Roberta '
                'Bragg CISSP Certification Training Guide (que) pg 206\n',
 'num': 3,
 'option_a': 'Identifies major functional areas of information.',
 'option_b': 'Quantifies the effect of the loss of the information.',
 'option_c': 'Requires the identification of information owners.',
 'option_d': 'Lists applications that support the business function.',
 'text': 'Which one of the following is an important characteristic of an '
         'information security policy?'}