要求: 根据上一行中的文本(即“GVH:”)将出现的“url: http://some.web.com/GVH-JBoss.ear” 替换为新文本 [例如: 网址: ftp://new.web.com/new.ear].
示例: 考虑如下文本行:
GVH:
url: http://some.web.com/GVH-JBoss.ear
sha1: 7b7b797735822d411c288d14510e9e023001d3ae
VID:
url: http://some.web.com/VID.ear
sha1: 2fcac8bdcfadcfc12f0a7dfef0bad01db5f8f8a8
预计:
GVH:
url: ftp://new.web.com/new.ear
sha1: 7b7b797735822d411c288d14510e9e023001d3ae
VID:
url: http://some.web.com/VID.ear
sha1: 2fcac8bdcfadcfc12f0a7dfef0bad01db5f8f8a8
我尝试使用 python 正则表达式 [re.sub() 方法] 来实现此目的:
re.sub(r'\s+GVH:[\s]*\s+url:\s\w+.*ear', 'url: ftp://new.web.com/new.ear', line.rstrip(), re.MULTILINE)
其他正则表达式尝试匹配此指定模式:
1. \s+GVH:[\s]*\s+url:\s\w+.*ear
2. (\s+GVH:\n)?\s*url:\s+\w+.*ear$
3. (\s+GVH:\n)?\s*url:\s+\w+.*ear$
4. [(?<=GVH:\s).*url:\s\w+.*ear$]
5. (?<=\sGVH:[\s\S])url: \w+.*ear
6. [\s]GVH:[\s\S](?=(\s+url: [\w]\.ear)
7. (^.*GVH:[\s]?$)|(^.*url:\s\w+.*ear$)`
使用所有这些正则表达式,只能找到任意一行的文本,但不能找到两行。
他们都未能捕获并替换这些文本行。
需要这方面的帮助。
print (re.sub(r'(GVH:\s+url:\s+).*?ear', r'\1ftp://new.web.com/new.ear', line))
GVH:
url: ftp://new.web.com/new.ear
sha1: 7b7b797735822d411c288d14510e9e023001d3ae
HVA:
url: http://some.web.com/HVA-JBoss.ear
sha1: e3ec053c65af5ce134c469ebbe3d7da29995369f
您可以使用
yaml
模块。
例如:
import yaml
with open(filename) as f:
data = yaml.load(f) #Read yml file
newVal = "ftp://new.web.com/new.ear"
data["GVH"]["url"] = newVal #Update Value
with open(filename, 'w') as outfile:
yaml.dump(data, outfile, default_flow_style=False) #Write Back