繁体   English   中英

在Python中的相同边界内替换多个模式

[英]Replace multiple patterns inside the same boundaries in Python

搜索文字:

{ 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)

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}'
def evaluate(m):
  return re.sub(r'(\w+):(' + re.escape(value) + r'\b)', field + ":\\2", m.group(0))

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

看到这个演示

蒂姆的答案确实很棒。 我的开采分为两个步骤:

  • 在括号之间获取所有内容
  • 循环所有它们以进行有效替换

这给出:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM