使用python和RegEx从简单的项目符号列表中提取JSON数据?

时间:2016-09-04 14:43:40

标签: python json regex

我正在编写一个测验应用,并希望从 data.txt 文件中提取多个选项问题 JSON ,该文件包含简单的嵌套项目符号列表格式如下:

data.txt中:

a + ++b

(注意:问题和答案中可能都有换行符)

我想要提取的所需JSON格式如下:

 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.
 ...

我希望能够通过简单的 python脚本来做到这一点,通过阅读我的data.txt并使用RegEx匹配来获取数据并相应地转换为JSON,然后将其写回一个文件。

我查看了正则表达式,但很难弄清楚我需要哪些RegEx才能获得将数据转换为JSON格式的匹配。

有人知道我在找哪个RegEx吗?或者有没有更好的方法从data.txt文件中提取问题数据作为JSON?

如果它更简单,我也会对JSON格式感到满意,该格式更直接地匹配原始项目符号列表格式的简单嵌套数据结构。

非常感谢。

1 个答案:

答案 0 :(得分:0)

所以在评论中建议regExs有帮助,我最终得到了以下regEx解决方案来帮助我的回答......

\n\d{1,3}\.\s以匹配问题编号,例如1. (仅适用于不超过3位的问号,即最大999)

\n[a-d]{1}\)\s以匹配多项选择答案,例如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)

感谢您给我一些提示来提出这个解决方案。