-1

要搜索的文本:

{ Field1:Value Field2:Value Field1:Value }

然后,我想在 Field 的每个实例等于某个值时查找并替换它,但前提是该字段位于 { & } 边界内。

注意:在 { 之后但在第一个字段之前可以有可变空格。以及不同数量的字段。

正则表达式:

({\s*)(?:Field1)(:(?:.*?)})

允许我将文本分成组,允许我重新创建具有不同字段名称的新文本。

例如:

\1Field3\2

但是,这将仅匹配 Field1 的第一个实例并忽略第二个实例,因为正则表达式引擎从关闭 } 继续

我当时想用 Lookbehind 和 Lookahead,买 Python 不支持这些方法的变量重复,所以就放弃了。

“re.sub”方法返回文本,如果找到/替换了正则表达式,则更改,但实际上并没有说明是否完成了替换,所以我什至不能循环直到没有找到匹配项,除非我做一个第二个正则表达式来验证哪个感觉不对。

有什么办法可以在一个正则表达式中做到这一点?

- - - 编辑 - - -

尽管仍处于多个阶段,但我设法将 Emmanuel 和 Ωmega 的解决方案提炼成我正在寻找的解决方案,但是我认为在这种情况下,多个步骤是唯一的解决方案。

伊曼纽尔的代码(为我的解决方案工作)

s = '{ Field1:Value Field2:Value Field1:Value } Field1:Value {Field1:Value}'
for insider in re.findall(r'{\s*Field1:.*?}', s):
    new = re.sub(r'Field1:', r'NewField:', insider)
    s = s.replace(insider, new)

Ωmega 的代码(适用于我的解决方案)

def evaluate(m):
  return re.sub('Field1:', 'NewField:', m.group(0))
input = '{ Field1:Value Field2:Value Field1:Value } Field1:Value {Field1:Value}'
output = re.sub('{[^{}]*?}', evaluate, input)
4

3 回答 3

1

Python 确实支持前瞻断言中的无限重复。因此,除非您有嵌套的{/}结构(这无法用 Python 的正则表达式引擎处理),否则您可以简单地检查下一个大括号是否是右大括号:

>>> import re
>>> subject = "{Field1:Value Field2:Value} Field3:Value {Field4:Value}"
>>> re.sub(r"Field(\d+):(\w+)(?=[^{}]*\})", r"NewField\1:\2", subject)
'{NewField1:Value NewField2:Value} Field3:Value {NewField4:Value}'
于 2012-11-29T13:47:45.520 回答
1
def evaluate(m):
  return re.sub(r'(\w+):(' + re.escape(value) + r'\b)', field + ":\\2", m.group(0))

output = re.sub(r'\{[^{}]*\}', evaluate, input)

请参阅此演示

于 2012-11-29T14:03:39.110 回答
1

蒂姆的回答真的很棒。矿井分两步进行:

  • 获取大括号之间的所有内容
  • 循环所有这些以进行有效替换

这给出了:

>>> s = '{ Field1:Value Field2:Value Field1:Value } Field4:Value {Field5:Value    }'
>>> for insider in re.findall(r'{((?:\s*Field\d+:Value\s*)*)}', s):
    new = re.sub(r'\s*Field(\d+):(\w+)\s*', r' NewField\1:\2', insider)
    s = s.replace(insider, new)

>>> s
'{ NewField1:Value NewField2:Value NewField1:Value} Field4:Value { NewField5:Value}'
于 2012-11-29T14:05:08.457 回答