【问题标题】:Remove quotation markers between quotation marks去掉引号之间的引号
【发布时间】:2019-06-13 03:07:12
【问题描述】:

我有一个像这样的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

【问题讨论】:

标签: python


【解决方案1】:

如果您的数据不包含,:,这将有效,因为我们需要一些锚来解开这个混乱:

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'}

【讨论】:

  • 谢谢。此外,如果值中有任何“:”怎么办?
  • 那将丢失我的正则表达式。
  • 如果值中有任何 ':'。应该使用什么正则表达式?
猜你喜欢
  • 1970-01-01
  • 2014-04-07
  • 2023-03-06
  • 1970-01-01
  • 2019-04-23
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
相关资源
最近更新 更多