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

2024-09-27 17:58:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个测验应用程序,希望从数据.txt文件,其中包含简单嵌套项目符号列表格式的问题+答案,如下所示:

数据.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."
  }
]

我希望能够通过阅读我的数据.txt使用RegEx匹配来获取数据并相应地转换为JSON,然后将其写回文件。你知道吗

我研究了正则表达式,但很难弄清楚需要哪些正则表达式来获得将数据转换为JSON格式的匹配项。你知道吗

有人知道我在找哪个正则表达式吗?或者有没有更好的方法将问题数据作为JSON从数据.txt文件?你知道吗

如果更简单的话,我也很乐意使用JSON格式,它可以更直接地匹配原始项目符号列表格式的简单嵌套数据结构。。你知道吗

非常感谢。你知道吗


Tags: 数据txtjsonmit格式derdieund
1条回答
网友
1楼 · 发布于 2024-09-27 17:58:45

所以在评论中建议regEx有帮助,我最终用下面的regEx解决方案来帮助我回答。。。你知道吗

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

以及

\n[a-d]{1}\)\s匹配多项选择答案,例如a)

由于没有人拥有我所希望的完美的几行代码,我最终编写了一个更明显的解决方案,我使用regex将字符串分解成子字符串,将这些子字符串添加到列表/数组中,然后将结果转换为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)

谢谢你给我提出这个解决方案的提示。你知道吗

相关问题 更多 >

    热门问题