Удалить пунктуацию только из файла JSON внутри кавычек - PullRequest
1 голос
/ 06 ноября 2019

У меня есть несколько файлов JSON, заполненных строками, которые могут содержать до нескольких сотен строк. В моем примере файла будет только три строки, но в среднем таких фраз примерно 200-500:

{
   "version": 1,
   "data": {
       "phrases":[
           "A few words that's it.",
           "This one, has a comma in it!",
           "hyphenated-sentence example"
        ]
   }
}

Мне нужно, чтобы в файл был включен скрипт (мы можем назвать его ExampleData.json) и удалить все знаки пунктуации (в частности, эти символы: ,.?!'- из файла, не удаляя , за пределами двойных кавычек. По сути, так:

"A few words that's it.",
"This one, has a comma in it!",
"hyphenated-sentence example."

Получается так:

"A few words that's it",
"This one has a comma in it",
"hyphenated sentence example"

Также обратите внимание, как удаляются все знаки препинания, кроме дефиса, который заменяется пробелом.


Я нашел почти такой же вопрос, как этот, но для csvфайлы здесь , но не удалось перевести версию csv во что-то, что будет работать с JSON.

Самым близким, что я получил с python, была строка через чужой ответ в другом потоке.

input_str = 'please, remove all the commas between quotes,"like in here, here, here!"'

quotes = False

def noCommas(string):
    quotes = False
    output = ''
    for char in string:
        if char == '"':
            quotes = True
        if quotes == False:
            output += char
        if char != ',' and quotes == True:
            output += char
    return output

print noCommas(input_str)

(Извините, я не знаю, как поместить блоки кода в кавычки)Но это работает только для одного персонажа одновременно. Но добавление каких-либо дополнительных правил приводит к тому, что текст вне кавычек удваивается (пожалуйста, становится pplleeaassee). И последнее, что я должен сделать это в python2.7.5, что из-за того, что я собрал в поиске, делает это немного сложнее. Мне жаль, что я все еще новичок в python и должен сделать что-то столь нетривиальное сразу, но на самом деле это был не мой выбор.

1 Ответ

4 голосов
/ 06 ноября 2019

Это должно сработать.

import re
import json

with open('C:/test/data.json') as json_file:
    data = json.load(json_file)



for idx, v in enumerate(data['data']['phrases']):
    data['data']['phrases'][idx] = re.sub(r'-',' ',data['data']['phrases'][idx])
    data['data']['phrases'][idx] = re.sub(r'[^\w\s]','',data['data']['phrases'][idx])


with open('C:/test/data.json', 'w') as outfile:
    json.dump(data, outfile,  indent=4)

Вариант 2:

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

import re
import json
import string




with open('C:/test/data.json') as json_file:
    data = json.load(json_file)

data = json.dumps(data)

strings = re.findall(r'"([^"]*)"', data)

for each in strings:
    new_str =  re.sub(r'-',' ', each)
    new_str = new_str.strip(string.punctuation)
    new_str =  re.sub(r',','', new_str)

    data = data.replace('"%s"' %each, '"%s"' %new_str)


with open('C:/test/data_output.json', 'w') as outfile:
    json.dump(json.loads(data), outfile,  indent=4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...