2016-03-30 16 views
0

に複数行の正規表現を格納する際に、私は次のパターンを持っています問題のpython

Question1: Quesion XYZ 
a. option1 
b. option2 
c. option3 
d. option4 

Question2 : Question next 
a. option1 
b. option2 
c. option3 
d. option4 

so on multiple questions 

このパターンは、テキストファイルにあります。私は、テキストファイルを読んで、各質問とそれぞれの選択肢を分離しようとしています。私は出力を

Block1 : 

    Question1: Quesion XYZ 
    a. option1 
    b. option2 
    c. option3 
    d. option4 

Block 2 :  
    Question2 : Question next 
    a. option1 
    b. option2 
    c. option3 
    d. option4 

としてそれぞれの質問とそれぞれのオプションを検索するようにします。私はそれぞれの質問とそれぞれのオプションを追加するlistを試していました。私はそれがエラーを与えている

import re 
txt = open("questions.txt") 
i = 0 ; 
for line in txt: 
    key = 'list' + str(i) 
    key = [] 
    # if line == "\n" : continue 
    if re.search("^\n", line): continue 
    searchObj = re.search("([\d]+)\.\s*(.*)", line) 
    if searchObj : 
     i = searchObj.group(1) 
     key = searchObj.group(2) 
    searchObj2 = re.search("[\w]+\.\s*(.*)", line) 
    if searchObj2 : 
     key.append = (searchObj2.group(1)) 

txt.close() 
print alist1 

のようなコーディング私は私が行っている各質問

を格納する複数のリストを作成します。さらに、上記の目的を解決するものではありません。私はそれについてもdictを使うことができると聞きました。どのようにファイルに質問の数nがあることができるかを知る必要があります。

+0

私は正規表現を使用しません。それを '手動で'抽出してください。そうすれば、デバッグして何が起きているのかを簡単に知ることができます。 –

答えて

0

このケースを解決するための一般的な方法は、テキストファイルの内容とフォーマット方法を変更する必要があるためです。つまり、reの式を調整することです。あなたに注文事項は、あなたはあなたの最高にOrderedDictの利点を得ることができます

>>> import re 
>>> 
>>> patQNbBody = re.compile('(?P<QNb>Question\\d+)\\s*:\\s*(?P<QBody>[\\w\\s]+)$', re.IGNORECASE|re.MULTILINE|re.DOTALL) 
>>> 
>>> patQopt = re.compile('^[a-z]\\.\\s*(?P<Opt>\\w+)$', re.IGNORECASE|re.MULTILINE|re.DOTALL) 
>>> 
>>> my_questions = [] 
>>> 
>>> with open('questions.txt', 'r') as f: 
     i = -1 
     for line in f: 
      m1 = patQNbBody.search(line) 
      if m1: 
       i += 1 
       p = m1.group(1) 
       my_questions.append({'Number':m1.group(1), 'Body':m1.group(2), 'options':[]}) 
      else: 
       m2 = patQopt.search(line) 
       if m2: 
        my_questions[i]['options'].append(m2.group(1)) 

>>> my_questions 
[{'options': ['option1', 'option2', 'option3', 'option4'], 'Number': 'Question1', 'Body': 'Quesion XYZ\n'}, {'options': ['option1', 'option2', 'option3', 'option4'], 'Number': 'Question2', 'Body': 'Question next\n'}] 

場合:次のように、各質問のデータを保持している各辞書で、辞書のリストを作成している

>>> import re 
>>> from collections import OrderedDict 
>>> 
>>> patQNbBody = re.compile('(?P<QNb>Question\\d+)\\s*:\\s*(?P<QBody>[\\w\\s]+)$', re.IGNORECASE|re.MULTILINE|re.DOTALL) 
>>> 
>>> patQopt = re.compile('^[a-z]\\.\\s*(?P<Opt>\\w+)$', re.IGNORECASE|re.MULTILINE|re.DOTALL) 
>>> 
>>> my_questions = [] 
>>> with open('test1.txt', 'r') as f: 
     i = -1 
     for line in f: 
      d = OrderedDict() 
      m1 = patQNbBody.search(line) 
      if m1: 
       i += 1 
       for k,v in zip(('Number','Body','Options'),(m1.group(1), m1.group(2), [])): 
        d[k] = v 
       my_questions.append(d) 
      else: 
       m2 = patQopt.search(line) 
       if m2: 
        my_questions[i]['Options'].append(m2.group(1)) 

>>> my_questions 
[OrderedDict([('Number', 'Question1'), ('Body', 'Quesion XYZ\n'), ('Options', ['option1', 'option2', 'option3', 'option4'])]), OrderedDict([('Number', 'Question2'), ('Body', 'Question next\n'), ('Options', ['option1', 'option2', 'option3', 'option4'])])] 
>>> 
>>> 
>>> my_questions[0]['Number'] 
'Question1' 
>>> my_questions[1]['Body'] 
'Question next\n' 
>>> 
>>> my_questions[1]['Options'] 
['option1', 'option2', 'option3', 'option4'] 
>>>