Python найти одинарные кавычки в JSON, которые содержатся в слове / строке - PullRequest
0 голосов
/ 06 марта 2020

Я работаю с парсингом json данных в SQL -запросах в python и мне нужно позаботиться о замене одинарных кавычек на двойные кавычки, поскольку запись получаемых данных неверна (и я не могу изменить это). Проблема, с которой я столкнулся, заключается в том, что некоторые строки написаны на английском языке и содержат одинарные кавычки.

'comment': 'bla bla it's you're can't bla bla',

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

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Хотя я согласен со всеми комментариями к вашему вопросу, так же, как упражнение, я попытался получить действительную строку json из того, что у вас есть. Кажется, это можно сделать с помощью нескольких шагов, включающих манипуляции со строками:

bad = "'comment': 'bla not, really, a comment: bla it's you're can't bla bla'," 
# note that bad has colons, commas and single quotes/apostrophes in it

one = bad.replace("': '",'": "') #separate the key from the value
two = one.replace("'",'"',1) #replace the single quote on the left side of the key with a double quote

#the following lines were lifted from https://stackoverflow.com/a/54945804/9448090
#replace the single quote on the right side of the value with a double quote; drop the last comma:

removal = "'"
reverse_removal = removal[::-1]
replacement = '"'
reverse_replacement = replacement[::-1]

three = two[::-1].replace(reverse_removal, reverse_replacement, 1)[::-1].replace('",','"')
good = "{"+three+"}" #final formatting for json
json.loads(good)

Вывод:

{'comment': "bla not, really, a comment: bla it's you're can't bla bla"}
0 голосов
/ 06 марта 2020

При условии, что вы предполагаете, что в ваших строках нет запятых и / или двоеточий, вы можете восстановить их, считая все строки между : и , в виде строки. Это может быть выполнено, например, путем разбиения регулярным выражением.

In [1]: s = "'comment1': 'bla bla it's you're can't bla bla','comment2': 'bla bla it's you're can't bla bla',"

In [2]: r = re.compile(r"[:,]")

In [3]: r.split(s)
Out[3]:
["'comment1'",
 " 'bla bla it's you're can't bla bla'",
 "'comment2'",
 " 'bla bla it's you're can't bla bla'",
 '']

Конечно, это довольно большое "если". Если даже есть вероятность, что ваши строки содержат символы запятой / двоеточия, то deceze является правильным, и вы СОЛНЕЧНЫЕ.

В общем, нет решения этой проблемы. Чтобы увидеть это, рассмотрим следующий (несколько надуманный) пример.

 ... 'comment': 'this is', 'my comments': 'Hi', 

Если в строках, заключенных в ', разрешено содержать ', то невозможно определить, подразумевается ли это как 'comment': "this is', 'my comments': 'Hi'", или 'comment': "this is", 'my comments': "Hi", ...

...