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

2024-10-06 06:49:44 发布

您现在位置:Python中文网/ 问答频道 /正文

要求:根据前一行中的文本,即“GVH:”替换出现在“url:http://some.web.com/GVH-JBoss.ear”中的文本行[例如:url: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正则表达式[回复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$)

有了这些正则表达式,我们只能找到其中一行的文本,但不能同时找到两行。你知道吗

他们都未能捕获和替换这些文本行。你知道吗

在这方面需要帮助。你知道吗


Tags: 文本recomwebhttpurl示例new
2条回答
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

相关问题 更多 >