Добавление цитат вокруг слов, предшествующих двоеточию в Python - PullRequest
1 голос
/ 18 февраля 2020

Я учусь Python (python3) и работаю с текстовым файлом, содержащим полу- JSON формат. Он не полон JSON, потому что «ключи» не заключены в кавычки. Я ищу, чтобы программно добавить кавычки вокруг всех этих ключевых имен. Мой план состоял в том, чтобы «открыть» этот файл и проанализировать каждую «строку» как отдельную строку.

От:

имя_ключа: {другое_ключ: "somevalue", второе_ключ: "anotherval"}

Into:

"имя_ключа": {"another_key": "somevalue", "second_key": "anotherval"}

Я уверен, что регулярное выражение будет быть идеальным способом сделать это - ради обучения я использую массивы ...

У меня есть код, который работает частично, но не все ключи получают круглые скобки вокруг них.

str = "this is: a string: testing testing: blah blah more: test: hereis: test:"

cp_str = list(str[::-1])

skip = False
find_end = False
for step in range(len(cp_str) - 1):
  if skip:    
    skip = False
    continue

  if cp_str[step] == ':':    
    cp_str.insert(step + 1, '"')
    skip = True
    find_end = True

  if not skip and find_end and not(ord(cp_str[step].lower()) > 95 and ord(cp_str[step].lower()) < 95+26):    
    cp_str.insert(step, '"')
    skip = True
    find_end = False

print(''.join(cp_str[::-1]))

Выходы:

это: строка ": тестирование" тестирование ": бла-бла" еще ":" тест ":" здесь ":" test ":

Буду признателен за любые советы или помощь по лучшим способам решения этой проблемы.

Ответы [ 2 ]

3 голосов
/ 18 февраля 2020

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

Поскольку ваш ввод действителен YAML, вы можете установить PyYAML , загрузить ввод как YAML и вывести структуру данных как JSON вместо этого:

import yaml
import json
s = 'key_name: { another_key: "somevalue", second_key: "anotherval" }'
print(json.dumps(yaml.load(s)))

Это выводит:

{"key_name": {"another_key": "somevalue", "second_key": "anotherval"}}
1 голос
/ 18 февраля 2020

Хотя шаблон ([{,]\s*)([^"]*?)(\s*:\s*) не будет охватывать все угловые случаи, он должен нормально работать для базового c JSON содержимого.

Пример использования:

>>> import re
>>> data = '{ another_key: "somevalue", second_key: "anotherval" }'
>>> repl_fn = lambda x: f'{x.group(1)}"{x.group(2)}"{x.group(3)}'
>>> re.sub(r'([{,]\s*)([^"]*?)(\s*:\s*)', repl_fn, data)
'{ "another_key": "somevalue", "second_key": "anotherval" }'
...