首页 > 解决方案 > 进行正则表达式替换的最佳方法

问题描述

我有以下代码来更改provider "aws"块内的版本字符串。使用re.search()re.sub()。是否有可能做到这一点re.sub()

def process(p, provider, version):
  g = re.search(r'provider\s+"%s"\s+\{[\s\S]*version\s+=\s+"(.*)"[\s\S]*\}' % provider, p).group(1)
  return re.sub(r'%s' % g, '~> ' + version, p)

p = """
provider "aws" {
  region  = var.region
  version = "~> 2.59"

  assume_role {
    role_arn = "tes_role"
  }
}
"""

r = process(p, "aws", "2.61")
print(r)

标签: pythonregexre

解决方案


是的,有可能,您需要在使用时使用捕获组和明确的替换反向引用re.sub,并且您需要稍微改变模式:

def process(p, provider, version):
  return re.sub(r'(provider\s+"{}"\s+{{[\s\S]*?version\s+=\s+"~>\s*)[^"]*'.format(provider),
    r'\g<1>{}'.format(version),
    p)

查看Python 演示

模式是

(provider\s+"aws"\s+{[\s\S]*?version\s+=\s+"~>\s*)[^"]*

而替代品是\g<1>2.61. 请参阅正则表达式演示

细节

  • (provider\s+"aws"\s+{[\s\S]*version\s+=\s+"~>\s*)- 第 1 组(\g<1>是对组值的反向引用(请注意,您不能使用\1,因为下一个字符是数字!)):
    • provider- 一个字
    • \s+- 1+ 空格
    • "aws"-"aws"
    • \s+- 1+ 空格
    • {- 一个{字符(在格式字符串中,必须加倍)
    • [\s\S]*- 0+ 个字符,尽可能少
    • version- 一个字version
    • \s+=\s+- 一个=包含 1+ 个空格的字符
    • "~>- 一个"~>子串
    • \s*- 0+ 个空格
  • [^"]*- 0+ 以外的字符"

推荐阅读