【发布时间】:2016-02-11 13:56:31
【问题描述】:
我有以下正则表达式:
pattern = '^[a-zA-Z0-9-_]*_(?P<pos>[A-Z]\d\d)_T\d{4}(?P<fID>F\d{3})L\d{2}A\d{2}(?P<zID>Z\d{2})(?P<cID>C\d{2})\.tif$'
匹配如下文件名:
filename = '151006_655866_Z01_T0001F015L01A02Z01C03.tif'
与组:
m = re.match(pattern, filename)
print m.group("pos") # Z01
print m.group("fID") # F015
print m.group("zID") # Z01
如何在 Python 中只用给定的字符串替换指定的组?
我尝试在函数调用中使用re.sub,但不知道这个函数应该是什么样子:
def replace_function(matchobj):
# how to replace only a given match group?
# (the following replaces *all* occurrences of "Z01" in this example)
return matchobj.group(0).replace(matchobj.group("slice"), "---")
print re.sub(pattern, replace_function, filename)
我想要的结果是:
151006_655866_Z01_T0001F015L01A02---C03.tif
【问题讨论】:
-
re.sub的repl参数(如果可调用)应采用单个匹配对象并返回一个字符串以替换原始匹配项。您的匹配项包含同一字符串的多个部分,因此并不适合这种用法 - 尝试仅捕获您要替换的部分。 -
@jonrsharpe 是的,我想到了,但我的想法是让模式可配置(即只需要包含几个命名组的输入),所以我希望有一种方法来替换该特定组,或至少检索其在目标字符串中的位置。但正如您所建议的,我想我需要解析模式以修改它以仅捕获所需的部分。
-
@JanEglinger 如果建议的解决方案按预期工作,请接受答案。如果不是,请解释原因或更好地提供失败的测试,我也会尝试修复代码。