Как я могу исправить это регулярное выражение для сопоставления с объектом в Json и заменить его как список объектов

#python #json #regex #string

#питон #json #регулярное выражение #строка

Вопрос:

Я пробовал следующее, но мне не удается сопоставить объект в Json

 :s*({[^"]*})
 

Я хочу знать, как заменить тип объекта в Json в виде списка объектов.

Вот пример Json:

 {
  "resourceType": "ChargeItem",
  "id": "example",
  "text": {
    "status": "generated",
    "session": "Done"
  },
  "identifier": [
    {
      "system": "http://myHospital.org/ChargeItems",
      "value": "654321"
    }
  ],
  "definitionUri": [
    "http://www.kbv.de/tools/ebm/html/01520_2904360860826220813632.html"
  ],
  "status": "billable",
  "code": {
    "coding": [
      {
        "code": "01510",
        "display": "Zusatzpauschale für Beobachtung nach diagnostischer Koronarangiografie"
      }
    ]
  }
}
 

Мне нужно, чтобы я хотел преобразовать в эту форму:

 {
  "resourceType": "ChargeItem",
  "id": "example",
  "text": [{
    "status": "generated",
    "session": "Done"
  }],
  "identifier": [
    {
      "system": "http://myHospital.org/ChargeItems",
      "value": "654321"
    }
  ],
  "definitionUri": [
    "http://www.kbv.de/tools/ebm/html/01520_2904360860826220813632.html"
  ],
  "status": "billable",
  "code": [{
    "coding": [
      {
        "code": "01510",
        "display": "Zusatzpauschale für Beobachtung nach diagnostischer Koronarangiografie"
      }
    ]
  }]
}

 

Комментарии:

1. Не было бы проще манипулировать им как объектом, а не пытаться изменить его структуру как строку?

2. Вы не хотите использовать регулярное выражение для изменения строки JSON. Это легко приведет к неправильному формату. Вы бы предпочли десериализовать его, затем обработать, а затем снова сериализовать

3. Регулярное выражение отлично подходит для простых операций, но кое-что просто проще сделать, манипулируя объектом, особенно в этом случае. Посмотрите, как преобразовать json в dict и как манипулировать a dict в python. Это действительно просто.

Ответ №1:

Похоже, это несколько простых преобразований:

Во-первых, измените

 "text": {
 

Для

 "text": [{
 

Во-вторых, изменить

 },
"identifier": [
 

Для

 }],
"identifier": [
 

В-третьих, изменить

  "code": {
 

Для

  "code": [{
 

И, наконец, изменить

   }
}
<EOF>
 

Для

   }]
}
<EOF>
 

Однако это может быть не так просто, как кажется, т. Е. Что, если identifer раздел присутствует не всегда или не сразу следует за text разделом?

Регулярные выражения — плохой выбор для выполнения этой работы. Было бы намного лучше прочитать файл json в собственную структуру данных Python, применить желаемые изменения, а затем сохранить json обратно в файл.

Комментарии:

1. я хочу преобразовать что-то вроде «key»: { «something»: «something1» } в «key»: [{ «something»: «something1» }] независимо от их имен

2. Основная трудность заключается в добавлении окончания ] , потому что оно не отображается в той же строке, что и ключ, и вы не можете глобально добавлять a ] после каждого } .

3. так что ему просто нужно сопоставить: { } и заменить на: [{ }]

4. Нет. Например, identifier раздел уже представляет собой список; предположительно, вы не хотите преобразовывать его в список списка.

Ответ №2:

Решение с использованием многострочного поиска регулярных выражений

 >>> import re

>>> blocks = re.compile(r'(?ms)(.*)("text": )([{][^{}] [}])(,.*"status": "billable"[^"] )("code": )([{][^"] "coding":[^]] ]s })')
>>> m = blocks.search(s)
>>> result = ""
>>> for i in range(1,len(m.groups())   1):
...   if i not in (3,6):
...     result  = m.group(i)
...   else:
...     result  = "["   m.group(i)   "]"
... 
>>> result  = "n}"