使用Python中的正则表达式替换基于上一个文本行中的模式的文本行

使用Python中的正则表达式替换基于上一个文本行中的模式的文本行,python,regex,Python,Regex,要求:根据前一行中的文本,即“GVH:”将出现的“url:”文本行替换为新文本[例如:url:] 示例: 考虑下面的文本行: GVH: 网址:http://some.web.com/GVH-JBoss.ear sha1:7b7b797735822d411c288d14510e9e023001d3ae 视频: 网址:http://some.web.com/VID.ear sha1:2FCAC8BDCFC12F0A7DFEF0BAD01DB5F8A8 期望值: GVH: 网址:ftp://ne

要求:根据前一行中的文本,即“GVH:”将出现的“url:”文本行替换为新文本[例如:url:]

示例: 考虑下面的文本行:

GVH:
网址:http://some.web.com/GVH-JBoss.ear
sha1:7b7b797735822d411c288d14510e9e023001d3ae
视频:
网址:http://some.web.com/VID.ear
sha1:2FCAC8BDCFC12F0A7DFEF0BAD01DB5F8A8

期望值:

GVH:
网址:ftp://new.web.com/new.ear
sha1:7b7b797735822d411c288d14510e9e023001d3ae
视频:
网址:http://some.web.com/VID.ear
sha1:2FCAC8BDCFC12F0A7DFEF0BAD01DB5F8A8

我尝试使用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.[(您可以使用
yaml
模块

Ex:

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

这是一个
yaml
文件吗?您正在使用大量不必要的方括号,这使正则表达式变得比需要的更复杂。请使用
[
]
将一组字符括起来,例如
[a-z]
[\w\s]
。另外
\w
仅包括字母数字字符和
\uu
,因此它不会捕获URL中的
://
。是的,输入文件是一个YAMLYes,这在没有正则表达式的情况下起作用。但要求是使用正则表达式替换文件内容。在使用PyYAML python YAML框架的情况下工作。但这需要用户在运行此codePerfect!之前在其计算机中显式安装PyYAML!
(GVH:\s+url:\s+。*?ear
此正则表达式符合我的要求。谢谢@Sunitha。
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