Использование REGEX для обработки вложенных двойных кавычек в строках JSON в Python

Я использую Generative AI API для возврата текстовых ответов в виде строк JSON, которые я собираюсь передавать в приложение в режиме реального времени. Проблема в том, что часто ответ JSON, предоставляемый GenAI API, содержит небольшие ошибки — чаще всего с двойными кавычками. Эти синтаксические проблемы в ответной строке JSON вызывают ошибки в моем коде Python при преобразовании их в JSON.

Например, у меня есть следующая строка JSON:
'{"test":"this is "test" of "a" test"","result":"your result is "out" in our website"}'

Как видите, значение «test» заключено в несколько двойных кавычек. Поэтому, если я попытаюсь преобразовать это в json, я получу ошибку. Я хочу использовать регулярное выражение для преобразования двойных кавычек в одинарные. Таким образом, результат может выглядеть следующим образом:
'{"test":"this is 'test' of 'a' test'", "result": "your result is 'out' in our website"}'

Лучшее, что я могу сделать, это следующее:

def repl_call(m):
    preq = m.group(1)
    qbody = m.group(2)
    qbody = re.sub( r'"', "'", qbody )
    return preq + '"' + qbody + '"'

print( re.sub( r'([:\[,{]\s*)"(.*?)"(?=\s*[:,\]}])', repl_call, text ))

Следующий код успешно возвращает желаемый результат. Однако, если бы я добавил запятую, например
{"test":"this is "test" of "a", test"","result":"your result is "out" in our website"}

...код ломается и возвращает следующее:
'{"test":"this is 'test' of 'a", test"","result":"your result is 'out' in our website"}'

:(

В настоящее время я попытался улучшить свою подсказку AI (инжиниринг подсказок), чтобы избежать двойных кавычек и возвращать только действительную строку JSON. В некоторой степени это работает, но я по-прежнему сталкиваюсь с достаточным количеством ошибок в синтаксисе, из-за которых мне приходится повторять одно и то же приглашение несколько раз, что влечет за собой ненужные задержки и затраты.

Мой вопрос: Есть ли такая вещь, как общая функция и шаблон REGEX, которые я могу применить в Python, чтобы исправить мою строку JSON, чтобы она правильно очищала синтаксические ошибки? В частности, касательно неуместных двойных кавычек.

Я открыт для различных предложений, включая возможные пакеты Python, которые могут справиться с очисткой строк JSON. Даже любые советы по продвинутым инструментам GenAI, обеспечивающим соблюдение JSON. Сейчас я использую Gemeni, который мне очень нравится. Но не позволяет применять JSON, как API OpenAI позволяет более явно.

О I presently use Gemeni- which I like a lot. But doesn't allow JSON enforcement like OpenAI's API allows more explicitly., полезен ли этот отчет? medium.com/google-cloud/…

Tanaike 15.08.2024 07:18

Пожалуйста, отредактируйте свой вопрос и включите минимальный воспроизводимый пример

Linda Lawton - DaImTo 15.08.2024 08:35

Используя регулярное выражение, вы можете сопоставить значение до следующего ключа или конца строки. Зафиксируйте значение и используйте функцию для преобразования двойных кавычек в одинарные, см. эту демонстрацию Python ( regex101)

bobble bubble 15.08.2024 11:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы запрашиваете ответ JSon, вам следует использовать response_mime_type, и тогда у вас не возникнет проблем с анализом JSon.

from dotenv import load_dotenv
import google.generativeai as genai
import os

load_dotenv()
genai.configure(api_key=os.environ['API_KEY'])
MODEL_NAME_LATEST = os.environ['MODEL_NAME_LATEST']

model = genai.GenerativeModel(
    model_name=MODEL_NAME_LATEST,
    # Set the `response_mime_type` to output JSON
    generation_config = {"response_mime_type": "application/json"})

prompt = """
  List 5 popular cookie recipes.
  Using this JSON schema:
    Recipe = {"recipe_name": str}
  Return a `list[Recipe]`
  """

response = model.generate_content(prompt)
print(response.text)

Просто не забудьте убедиться, что объект JSon, который вы ему указываете, действительно является правильным JSon, иначе он может построить его неправильно, включая все там, где они должны быть.

схема ответа

Другой вариант — использовать схему ответа.

from dotenv import load_dotenv
import google.generativeai as genai
import os
import typing_extensions as typing

load_dotenv()
genai.configure(api_key=os.environ['API_KEY'])
MODEL_NAME_LATEST = os.environ['MODEL_NAME_LATEST']


class Recipe(typing.TypedDict):
    recipe_name: str


model = genai.GenerativeModel(
    model_name=MODEL_NAME_LATEST,
    # Set the `response_mime_type` to output JSON
    # Pass the schema object to the `response_schema` field
    generation_config = {"response_mime_type": "application/json",
                       "response_schema": list[Recipe]})

prompt = "List 5 popular cookie recipes"

response = model.generate_content(prompt)
print(response.text)

см. Режим Json

Другие вопросы по теме