У меня есть (правильно сформированная) большая строковая переменная, которую я превращаю в списки словарей. Я перебираю массивную строку, разделенную символами новой строки, и запускаю следующую команду list(eval(i))
. Это работает в большинстве случаев, но для каждого сгенерированного исключения я добавляю «искаженную» строку в массив failed_attempt
. Я уже целый час осматриваю сбойные случаи и считаю, что причиной их сбоя является всякий раз, когда есть дополнительная кавычка, которая не является частью ключей для словаря. Например,
eval('''[{"question":"What does "AR" stand for?","category":"DFB","answers":["Assault Rifle","Army Rifle","Automatic Rifle","Armalite Rifle"],"sources":["https://www.npr.org/2018/02/28/588861820/a-brief-history-of-the-ar-15"]}]''')
Сбой, потому что вокруг «AR» есть кавычки. Если вы замените кавычки одинарными кавычками, например,
eval('''[{"question":"What does 'AR' stand for?","category":"DFB","answers":["Assault Rifle","Army Rifle","Automatic Rifle","Armalite Rifle"],"sources":["https://www.npr.org/2018/02/28/588861820/a-brief-history-of-the-ar-15"]}]''')
Теперь это выполнится успешно.
Аналогично:
eval('''[{"question":"Test Question, Test Question?","category":"DFB","answers":["2004","1930","1981","This has never occurred"],"sources":[""SOWELL: Exploding myths""]}]''')
Сбой из-за кавычек вокруг "Соуэлла", но снова успешно, если вы замените их одинарными кавычками.
Поэтому мне нужен способ определить кавычки, которые появляются где угодно, кроме клавиш словаря (question
, category
, sources
), и заменить их одинарными кавычками. Я не уверен, что это правильно.
@ Представление Wiktor почти сработает, но не удастся выполнить следующее:
example = '''[{"question":"Which of the following is NOT considered to be "interstate commerce" by the Supreme Court, and this cannot be regulated by Congress?","category":"DFB","answers":["ANSWER 1","ANSWER 2","ANSWER 3","All of these are considered "Interstate Commerce""],"sources":["SOURCE 1","SOURCE 2","SOURCE 3"]}]'''
re.sub(r'("\w+":[[{]*")(.*?)("(?:,|]*}))', lambda x: "{}{}{}".format(x.group(1),x.group(2).replace('"', "'"),x.group(3)), example)
Out[170]: '[{"question":"Which of the following is NOT considered to be \'interstate commerce\' by the Supreme Court, and this cannot be regulated by Congress?","category":"DFB","answers":["ANSWER 1","ANSWER 2","ANSWER 3","All of these are considered "Interstate Commerce""],"sources":["SOURCE 1","SOURCE 2","SOURCE 3"]}]'
Обратите внимание, что второй набор двойных кавычек на "Interstate Commerce" в ответах не заменяется,