regex - 用python打开json文件时换行符
问题描述
我有一个 json 文件,在某些行我发现
{"fruit": "C", "opinion": "too bitter", "country": "X"},
{"fruit": "D", "opinion": "too bitter but "sometimes" sweet", "country": "Y"},
{"fruit": "A", "opinion": "salt "and" ok", "country": "Z"},
如何自动化以下代码?
with open("fruits.json", "rt") as f:
with open("fruit_f.json", "wt") as f2:
for i in f:
f2.write(i.replace('"sometimes"', 'sometimes'))
我的问题是“”中的字符串(或数字)可以更改,我无法跟踪它们中的每一个,因为它是一个巨大的文件。是否可以使用 re.sub ?如果无法以 json 格式打开,有没有办法将其转换为 pandas df?
解决方案
这是一个难题,我想不出银弹可以用正则表达式一次性解决这个问题,因为这是一个嵌套模式,在递归结构中有多个可能的锚点。
我可以提供的是一个两步解决方案,a)尝试查找用双引号括起来的所有数据值,b)如果有的话,替换未转义的引号:
import regex as re
regex = r"(?<=\": \").*?(?=\"\s*[,}])"
input_str = ("{\"fruit\": \"C\", \"opinion\": \"too bitter\", \"country\": \"X\"},\n"
"{\"fruit\": \"D\", \"opinion\": \"too bitter but \"sometimes\" sweet\", \"country\": \"Y\"},\n"
"{\"fruit\": \"A\", \"opinion\": \"salt \"and\" ok\", \"country\": \"Z\"},")
matches = re.finditer(regex, test_str, re.MULTILINE | re.UNICODE)
for matchNum, match in enumerate(matches):
matchNum = matchNum + 1
##print(match.group().replace('"', '\"'))
if "\"" in match.group():
input_str = input_str.replace(match.group(), match.group().replace("\"", "\\\""))
如您所见,如果存在未转义的引号,则替换将应用于 input_string。
输出:print(input_str)
{"fruit": "C", "opinion": "too bitter", "country": "X"},
{"fruit": "D", "opinion": "too bitter but \"sometimes\" sweet", "country": "Y"},
{"fruit": "A", "opinion": "salt \"and\" ok", "country": "Z"},
最后,您应该得到一个有效的 JSON 文件。
推荐阅读
- javascript - 如何从 CMD 命令行启动 Node.js 应用程序,从另一个 .Net core 3.0 应用程序调用它?
- html - 如何使用媒体查询来改变位置
- c# - PayPal响应式结账?
- spring - 项目中没有@EnableScheduling注解的调度器是如何运行的
- go - Vscode golang 扩展在格式上需要很长时间
- javascript - 如果本地存储中存在该评论的 ID,如何禁用该评论的投票按钮?
- javascript - 我如何通过将 AppMetrica 添加到 react-native 项目来修复错误
- c++ - src/bsoncxx/CMakeLists.txt 中的 CMake 错误 - Mongodb Cxx 驱动程序
- java - Java 基本运算符返回类型
- javascript - 如何在我的 javascript Web 应用程序的数据库层中为类函数编写单元测试?