Python 仅在引号内从JSON文件中删除Puncuation
我有多个JSON文件,其中填充的字符串最多可以达到几百行。在我的文件示例中,我只有三行,但这些短语平均约有200-500行: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" ] }
{
"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的确切外观的情况下,我只是尝试提供一种更健壮的方法。我知道它仍然有缺陷,但至少提供了另一种使用方法