2016-09-04 15 views
0

私はクイズアプリを書いていますし、次のようにシンプルなネストされた箇条書きのリスト形式で質問+回答をdata.txtをファイルからJSONなど複数の選択肢の質問を抽出するために探しています:pythonとRegExを使用して簡単な箇条書きリストからJSONデータを抽出しますか?

data.txtを:

1. Der Begriff Aerodynamik steht für Luft und Bewegung. 
Was entsteht, wenn man sich durch die Luft bewegt? 
a) Die Reibung der Luftteilchen am Körper verursacht einen Luftwiderstand. 
b) Je höher die Geschwindigkeit durch die Luft ist, desto mehr Luftkraft entsteht. 
c) Die Luft bekommt merklich Substanz und wirkt mit ihrer Kraft 
auf die ihr gebotene Form/Fläche ein. 
d) Alle Antworten sind richtig. 
2. Welcher Effekt wird durch Luftströmung um einen Körper mit einer der folgenden Formen erzeugt? 
a) Eine Tropfenform hat einen geringen Luftwiderstand. 
b) Eine hohle Halbkugel (Rundkappenreserve) hat einen hohen Luftwiderstand. 
c) Ein Flächenfallschirmprofil setzt die Luftströmung durch Sog- und Druckwirkung 
in Auftriebsenergie um. 
... 

(注:質問と回答の両方に改行があるかもしれません)

私が抽出したい希望JSONフォーマットは以下の通りです:

[ 
    { 
    "number": 1, 
    "question": "Der Begriff Aerodynamik steht für Luft und Bewegung. Was entsteht, wenn man sich durch die Luft bewegt?", 
    "a": "Die Reibung der Luftteilchen am Körper verursacht einen Luftwiderstand.", 
    "b": "Je höher die Geschwindigkeit durch die Luft ist, desto mehr Luftkraft entsteht.", 
    "c": "Die Luft bekommt merklich Substanz und wirkt mit ihrer Kraft auf die ihr gebotene Form/Fläche ein.", 
    "d": "Alle Antworten sind richtig." 
    }, 
    { 
    "number": 2, 
    "question": "Welcher Effekt wird durch Luftströmung um einen Körper mit einer der folgenden Formen erzeugt?", 
    "a": "Eine Tropfenform hat einen geringen Luftwiderstand.", 
    "b": "Eine hohle Halbkugel (Rundkappenreserve) hat einen hohen Luftwiderstand.", 
    "c": "Ein Flächenfallschirmprofil setzt die Luftströmung durch Sog- und Druckwirkung in Auftriebsenergie um.", 
    "d": "Alle Antworten sind richtig." 
    } 
] 

私はdata.txtをを読んで、正規表現の一致を使用することにより、簡単なPythonスクリプトでこれを行うことができるように期待していましたそれに応じてデータを取得してJSONに変換し、それをファイルに書き戻します。

正規表現を調べましたが、データをJSON形式に変換するために一致する正規表現を取得する必要があるRegExを把握するのに苦労しました。

どのようなRegExをお探しですか?あるいは、data.txtファイルから質問データをJSONとして抽出する方が良いでしょうか?

、それははるかに簡単だった場合、私はまた..

おかげで多くのことをより直接的に、元の箇条書きリスト形式の簡単なネストされたデータ構造と一致するJSON形式で幸せになります。

+0

この問題に取り組むには、自分自身に質問することができます。私が必要とするすべての部分をユニークにするには?たとえば、質問には数字とドットで一意にマークされます。そしてスペース。答えは、スペース、文字、括弧、スペースでマークされています。それぞれの正規表現は '[0-9] + [。] \ s'と' \ s [a-z] [)] \ s'です。これらの正規表現を使用すると、1つの質問チャンク(回答を含む)または最初の質問テキストを検索し、残りの部分を自分でプログラムすることができます。グループをご覧ください(https://docs.python.org/2/library/re.html#re.MatchObject)。グループ – Munchhausen

+0

私の最初の提案の例は、こちらをご覧ください:https://regex101.com/r/fT8vD0/1 – Munchhausen

答えて

0

だから提案regExsが助けたコメントで、私は

\n\d{1,3}\.\s質問番号、例えば一致するように...私の答えを助けるために、次の正規表現のソリューションになってしまいました1.

\n[a-d]{1}\)\s

は、複数の選択肢の答えと一致するように、例えば(のみ3桁を超えてはいけない質問の数、すなわち、最大999のために働きます) a)

誰も私が期待していたコードをいくつも完璧に作成していなかったので、RegExsを使って文字列を部分文字列に分割し、それらの部分文字列をLists/Arraysに追加してから変換しますJSONの結果。私が終わったスクリプトは以下の通りです:

# coding=utf-8 
import re 
import json 

#------------------------ 

firstQuestionNumber = 1 

filename = 'data' 
fileextension = '.txt' 

#------------------------ 

f = open(filename + fileextension, 'r') 
s = f.read() 

# replace question numbers and answer letters with $$$ and ### so it can easily be split later 
# recover the question and answer numbers by order of appearance (assuming continuous numbering) 

s1 = re.sub("\n\d{1,3}\.\s","$$$", s) 
s2 = re.sub("\n[a-d]{1}\)\s","###", s1) 

questionList = [] 

questions = s2.split("$$$") 

for question in questions: 

    questionNumber = questions.index(question) 

    if questionNumber!=0: 
     questionSplits = question.split("###") 

     questionData = {} 
     questionData["number"] = questionNumber - 1 + firstQuestionNumber 
     questionData["question"] = questionSplits[0] 
     questionData["a"] = questionSplits[1] 
     questionData["b"] = questionSplits[2] 
     questionData["c"] = questionSplits[3] 
     questionData["d"] = questionSplits[4] 

     questionList.append(questionData) 


json_data = json.dumps(questionList) 

f = open(filename+'_json'+'.txt', 'w') 
f.write(json_data) 

私はこの解決策を思いついてくれてありがとう。

関連する問題