python - 去掉引号之间的引号
问题描述
我有一个像这样的json格式的字符串
{"1":"abc"abc"abc","2":"xyz"xyz"xyz"}
但是如果我想把它转换成 json 数据,我需要删除 '"' 之间的 '"' 并得到一个如下所示的字符串
{"1":"abcabcabc","2":"xyzxyzxyz"}
我尝试使用 re.sub 来做到这一点,但失败了。任何人都可以帮助我吗?我的脚本如下:
a='{"1":"abc"de"fg","2":"xyz"xyz"xyz"}'
r = re.compile(r'(?<!\:)(?<=.+)"|(?<!,)"|"(?!}|,)')
b = r.sub('', a)
print(b)
当我运行脚本时,结果如下:
Traceback (most recent call last):
File "./_t1.py", line 5, in <module>
r = re.compile(r'(?<!\:)(?<=.+)"|(?<!,)"|"(?!}|,)')
File "/home/emc/ssd/anaconda3/lib/python3.6/re.py", line 233, in compile
return _compile(pattern, flags)
File "/home/emc/ssd/anaconda3/lib/python3.6/re.py", line 301, in _compile
p = sre_compile.compile(pattern, flags)
File "/home/emc/ssd/anaconda3/lib/python3.6/sre_compile.py", line 566, in compile
code = _code(p, flags)
File "/home/emc/ssd/anaconda3/lib/python3.6/sre_compile.py", line 551, in _code
_compile(code, p.data, flags)
File "/home/emc/ssd/anaconda3/lib/python3.6/sre_compile.py", line 187, in _compile
_compile(code, av, flags)
File "/home/emc/ssd/anaconda3/lib/python3.6/sre_compile.py", line 160, in _compile
raise error("look-behind requires fixed-width pattern")
sre_constants.error: look-behind requires fixed-width pattern
解决方案
如果您的数据不包含,
,或者:
因为我们需要一些锚来解开这个混乱,那么这很有效:
import re
a='{"1":"abc"de"fg","2":"xyz"xyz"xyz"}'
b = re.sub('"((?:[^,:]|")*)"',lambda m : '"{}"'.format(m.group(1).replace('"','')),a)
>>> b
'{"1":"abcdefg","2":"xyzxyzxyz"}'
- 正则表达式匹配引号之间的字符串,替换函数删除内引号。
- 我们创建一个内部非捕获
(?:[^,:]|")
组来告诉匹配引号或逗号和冒号以外的任何内容。
现在b
可以解析为json:
>>> import json
>>> json.loads(b)
{'1': 'abcdefg', '2': 'xyzxyzxyz'}
现在如果字符串包含:
怎么办?上面的解决方案不起作用。我们必须适应它:
- 根据
":"
(可能有空格)拆分 - 对拆分列表的所有元素应用与上述类似的正则表达式(仅删除第一个引号)
- 加入元素
":"
像这样:
import re,json
# a lot of colons in keys & values
a='{"1":"a:bc"de"fg","2:":"xy::z"xyz"xyz"}'
b = '":"'.join(re.sub('((?:[^,:]|")*)"',lambda m : '{}"'.format(m.group(1).replace('"','')),x) for x in re.split('"\s*:\s*"',a))
print(json.loads(b))
导致正确解析json
:
{'1': 'a:bcdefg', '2:': 'xy::zxyzxyz'}
推荐阅读
- c# - ASP.NET Core MVC 从查询中获取模型属性的属性
- java - 改造 API 调用(java)返回空对象
- powershell - SPN 和带有 Kerberos 的远程 Powershell - Hyper-V Vm
- javascript - 有没有办法在 React App 中添加一个不允许空输入的条件?
- powershell - ESpeakNG 语音合成器(在 PowerShell 中)无法识别 UTF-8 文本
- php - 如何在 phpdesktop-chrome 中嵌入 mysql
- latex - 同情符号$Delta x$
- javascript - 如何在不使用任何 npm 包的情况下在 react native 中制作自定义轮播或图像幻灯片
- angular - 如何从输入文件中删除重复文件(Angular)
- spring-boot - 为什么 LoginModule 中的 @Autowired 返回 null?