<p>使用<a href="https://docs.python.org/2/library/re.html#re.sub" rel="nofollow">^{<cd1>}</a>:</p>
<pre><code>In [1]: import re
In [2]: text = '{ query: { and: [ { and: [ { _t: "Manifest" }, { or: [ { and: [ { _i: { gt: "53b2616fe4b028359ac3fea4" } } ] } ] }, { _s: "active" } ] }, { ENu_v: { elemMatch: { EOJ_v: { in: [ "*", "Production", "QA " ] } } } } ] }, orderby: { _i: 1 } } '
In [3]: re.sub('(\w+):', r'"\1":', text)
Out[3]: '{ "query": { "and": [ { "and": [ { "_t": "Manifest" }, { "or": [ { "and": [ { "_i": { "gt": "53b2616fe4b028359ac3fea4" } } ] } ] }, { "_s": "active" } ] }, { "ENu_v": { "elemMatch": { "EOJ_v": { "in": [ "*", "Production", "QA " ] } } } } ] }, "orderby": { "_i": 1 } } '
</code></pre>
<p>请注意,您必须使用原始字符串文本(或转义<code>\1</code>作为<code>\\1</code>)作为替换文本,否则将无法获得预期的输出。在</p>
<hr/>
<p>我假设你的文本中没有“奇怪”的东西,比如:</p>
<ul>
<li>值内的冒号(例如<code>{a: "some:string"}</code>;此解决方案不保留<code>"some:string"</code>)</li>
<li>包含嵌套结构的复杂字符串(例如<code>{a: "{b : \"hello\"}"}</code>)</li>
</ul>
<p>如果这些假设不成立,您就必须实际地<em>解析</em>文本,而且您不能单独使用regex安全地转换它。在</p>
<p><code>ast</code>模块与<code>codegen</code>第三方模块一起使用,可以很容易地操作这些数据。例如,您可以创建<code>NodeTransformer</code>子类,例如:</p>
^{pr2}$
<p>并将其用作:</p>
<pre><code>import ast, codegen
codegen.to_source(QuoteNames().visit(ast.parse(text))
</code></pre>
<p>但是,示例文本在语法上不是有效的文本,因为某些方括号不匹配(这可能是示例中的错误),有些字符串值缺少结束引号,并且不能在标识符中使用<code>and</code>或{<cd11>}。在</p>
<p>如果您可以修复格式以匹配python语法,那么上面的解决方案比使用regex的解决方案更健壮。但是,如果这是不可能的,您就必须为它编写自己的解析器,或者寻找能够做到这一点的第三方模块。在</p>