如果单词与模式匹配,则用字符将其括起来

2024-09-26 22:52:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个输入字符串:

'{ query: { and: [ { and: [ { _t: "Manifest" }, { or: [ { and: [ { _i: { gt: "53b2616fe4b028359ac3fea4" } } ] } ] }, { _s: "active" } ] }, { ENu_v: { elemMatch: { EOJ_v: { in: [ "*", "Production", "QA    " ] } } } } ] }, orderby: { _i: 1 } } '

我想把它改成字典。在

^{pr2}$

但这将引发一个例外,因为 query应该是"query"and应该是{} 等等。在

所以我想把所有的字符串,比如string改成"string",如何实现这一点呢?在


Tags: orand字符串ingtstringqueryqa
2条回答

使用^{}

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

请注意,您必须使用原始字符串文本(或转义\1作为\\1)作为替换文本,否则将无法获得预期的输出。在


我假设你的文本中没有“奇怪”的东西,比如:

  • 值内的冒号(例如{a: "some:string"};此解决方案不保留"some:string"
  • 包含嵌套结构的复杂字符串(例如{a: "{b : \"hello\"}"}

如果这些假设不成立,您就必须实际地解析文本,而且您不能单独使用regex安全地转换它。在

ast模块与codegen第三方模块一起使用,可以很容易地操作这些数据。例如,您可以创建NodeTransformer子类,例如:

^{pr2}$

并将其用作:

import ast, codegen
codegen.to_source(QuoteNames().visit(ast.parse(text))

但是,示例文本在语法上不是有效的文本,因为某些方括号不匹配(这可能是示例中的错误),有些字符串值缺少结束引号,并且不能在标识符中使用and或{}。在

如果您可以修复格式以匹配python语法,那么上面的解决方案比使用regex的解决方案更健壮。但是,如果这是不可能的,您就必须为它编写自己的解析器,或者寻找能够做到这一点的第三方模块。在

您可以匹配以下内容:

'(\w+):'

并替换为:

^{pr2}$

其中\1是第一个捕获的组。在

你可以在这里看到它的作用:DEMO

相关问题 更多 >

    热门问题