Python 仅在引号内从JSON文件中删除Puncuation

Python 仅在引号内从JSON文件中删除Puncuation,python,json,python-2.7,Python,Json,Python 2.7,我有多个JSON文件,其中填充的字符串最多可以达到几百行。在我的文件示例中,我只有三行,但这些短语平均约有200-500行: { "version": 1, "data": { "phrases":[ "A few words that's it.", "This one, has a comma in it!", "hyphenated-sentence example" ] }

我有多个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得到的最接近的结果是在另一个线程上使用了字符串via

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的新手,必须马上做一些非常重要的事情,但这不是我的选择。

这应该行得通

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)
这应该行得通

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)

尝试将json作为dict加载,然后按照这个答案的建议使用re.sub或str.translate处理字符串以删除不需要的字符,然后再次将其保存到文件中。我已经能够以自己的方式完成大部分逻辑。我将.json文件作为fin打开,并将data=fin.read data=data.replace“?”应用于除逗号以外的所有适用字符。剩下的就是找出如何确定逗号是否在双引号内。我能想到的方法是:如果逗号在a\n旁边,如果它在双引号旁边,或者如果它位于两个引号内。仍然不知道这些或另一个路由是否是更好的选择。尝试将json作为dict加载,然后按照此答案建议使用re.sub或str.translate处理字符串以删除不需要的字符,然后再次将其保存到文件中。我已经能够以我的方式完成大部分逻辑。我将.json文件作为fin打开,并将data=fin.read data=data.replace“?”应用于除逗号以外的所有适用字符。剩下的就是找出如何确定逗号是否在双引号内。我能想到的方法是:如果逗号在a\n旁边,如果它在双引号旁边,或者如果它位于两个引号内。我仍然不知道这两个路由中的一个或另一个路由是更好的选择。对不起,我应该在OP中指定这些是单独的JSON文件,最多可以得到几百行字符串。因此,我不会在python脚本中使用实际的JSON,而是作为我正在编辑的单个文件。我会更新我的帖子以更好地反映这一点。啊,好的。明天早上我会给它一个可行的解决方案。我只是想澄清一下,这些短语都说完了吗?你基本上想从所有值中删除标点符号?不管它的钥匙是什么?是的。所以这三个示例短语,假设有500个左右。这就是整个文件。我还应该注意,在我的.json文件中,data=在{不存在。如果可以,我会更改它,但我不是生成这些文件的人。@chitown88在您的第一个选项1中,您可以像在选项2中一样加载json,仅此而已。@VictorGalisson,我同意我在评论中提到过这一点,但实际上我只是在解决方案中对其进行了编辑。。但我开始考虑是否有嵌套的值,或者如果json没有明确的短语作为键。不知道json的确切外观,我只是想提供一种更健壮的方式。我知道它仍然存在缺陷,但至少提供了另一种使用方法。对不起,我应该在OP中指定这些是单独的json文件,最多可以使用几百个字符串的红线。因此,我不会在python脚本中使用实际的JSON,而是作为我正在编辑的单个文件。我将更新我的帖子,以更好地反映这一点。啊,好的。我明天早上会给出一个可行的解决方案。只是为了澄清一下,这些短语都已经完成了吗?你基本上希望删除标点符号以供参考m都是价值观?不管它的关键是什么?是的。所以这三个示例短语,假设有500个左右。这就是
整个文件。我还应该注意,在我的.json文件中,data=在{不存在。如果可以,我会更改它,但我不是生成这些文件的人。@chitown88在您的第一个选项1中,您可以像在选项2中一样加载json,仅此而已。@VictorGalisson,我同意我在评论中提到过这一点,但实际上我只是在解决方案中对其进行了编辑。。但我开始考虑是否有嵌套的值,或者如果json没有明确的短语作为键。在不知道json的确切外观的情况下,我只是尝试提供一种更健壮的方法。我知道它仍然有缺陷,但至少提供了另一种使用方法