2017-07-16 98 views
2

最近我建立一個考試測試系統,現在我必須組織爲遵循一個txt文件中的問題和答案:如何使用Python讀取txt文件中的數據塊並將其轉換爲結構化數據?

Q1

所有除 安全策略的下面是基本組成部分A.問題的定義和相關術語的陳述。 B.角色和責任說明。 C.適用性和符合性要求聲明。 D.對特性和要求的表現進行說明。

答案:d

闡釋:政策被認爲是文檔的第一和最高水平, 從哪個標準,程序下層的元件,並且 指引流動。然而,這個訂單並不意味着這些政策比下面的要素更重要。由於戰略原因,這些更高級的政策 是更爲一般的政策和聲明,因此應該首先創建 ,然後才能遵循更多的戰術要素 。 -Ronald Krutz的CISSP準備指南(黃金版) 第13頁

Q2

確保業務信息的完整性是

A.加密首要關注 安全

B.程序安全。

C.邏輯安全

D.在線安全

答案:B

釋解:程序看作爲政策鏈 的最低水平,因爲他們是最接近計算機並提供有關配置和安裝問題的詳細步驟 。他們提供的步驟可以實際執行 政策,標準和 準則中的聲明......安全程序,標準,度量,慣例和策略涵蓋了許多不同的主題領域。 - 肖·哈里斯 所有功能於一身的CISSP認證指南第44-45

Q3

以下哪一個是 信息安全政策的一個重要特點呢? A.確定信息的主要功能區域。 B.量化信息丟失的影響。

C.需要識別信息所有者。 D.列出支持業務功能的應用程序。

答案:A

闡釋:描述的程序 目標信息安全政策領域的高層次計劃。政策不是指南或標準,也不是他們的程序或控制。策略通常描述安全性 條款,而不是具體規定。他們提供了一個整體 安全計劃的藍圖,就像一個規範定義了你的下一個產品 - 羅伯塔布拉格CISSP認證培訓指南(闕)第206

我想要做的是,我想改變我的每個問題到結構化的數據格式(你可以看到如下),以便我可以將它們存儲在數據庫中。

organized format

我想使用Python來完成這個任務,我有點知道我需要使用正則表達式來解決它,但我不知道該怎麼辦。

任何人都可以幫忙嗎?您的幫助將非常感激!謝謝!

+1

你有什麼迄今所做?什麼不起作用? – cco

+0

(a)用正則表達式做這件事會讓這個變得更加困難。相反,只需逐行閱讀文本文件,並使用每行的前幾個字符作爲指導將內容放入數據庫的字段。例如,以「答案」開頭的行顯然必須進入「答案」字段。 (b)在SO上,您需要向我們展示代碼,您*已經寫了關於如何糾正或按照自己的意願做出的具體問題。 –

+0

對於這個正則表達式,你只需要重複你用來匹配A的模式,與其他...因此[正則表達式](https://regex101.com/r/yg075G/1)非常簡單...然而,我不會使用正則表達式,做比爾說的話,它應該更容易,沒有錯誤(如果他們不小心向你發送了一個不應該出現換行符的字符串,就會發生這種情況,等等。) – Mateus

回答

0

一個想法是,信息會更容易一點像CSV或TSV的標準格式解析。

就我個人而言,我發現一個基於正則表達式的解決方案來解析這種難以閱讀的輸入格式。現有的正則表達式的答案寫得很好,但只需要一個怪異的正則表達式,所以這不是我個人選擇解決這個特定問題的實現。我認爲在解析邏輯的基礎上增加一個更簡單的替代答案是很有益的,這些邏輯基於常用的str函數,如拆分,替換和刪除換行符和樣板文本。

我認爲這個問題也可以通過使用csv.reader並將其自定義分隔符設置爲'\n\n'來解決,但是,無論出於何種原因,該函數僅支持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?'} 
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) 
) 
相關問題