python - 进行正则表达式替换的最佳方法
问题描述
我有以下代码来更改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)
解决方案
是的,有可能,您需要在使用时使用捕获组和明确的替换反向引用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)
模式是
(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+ 以外的字符"
推荐阅读
- python - 如何处理 2 个小部件事件来控制数据框?
- node.js - firebase 功能中的承诺问题
- python - python如何将tika与现有的jar文件一起使用而无需再次下载
- python - 如何使 pyplot scatter 中的标记大小不依赖于图形的比例?
- php - 如何从数据库特定的选定值添加到解码的 Json 数组
- angular - 打开网站时加载所有内容
- javascript - 我想要警报“余额很大!” 直接地
- c# - 在 LINQ 的 JOIN 中使用 AND
- getstream-io - 如何使用 react-activity-feed 客户端删除帖子?
- nginx - Nginx 多实例