我可以使用以下代码编辑文件。我也能匹配正则表达式并替换它。但是,在替换时,我想在(r\d+ ASSRT\)
中的text1_to_search
中捕获该号码,并在replacement1_text
中使用相同的号码。
现在,我将其硬编码为749679
。我怎么能这样做?
import fileinput, re
filename = 'epivers.h'
text1_to_search = re.compile(r'#define\s+EPI_VERSION_STR\s+"\d+(?:\.\d+)+\s+\(TOB\)\s+\(r\d+ ASSRT\)"')
replacement1_text = '#define EPI_VERSION_STR "9.130.27.50.1.2.3 (r749679 ASSRT)"'
for line in fileinput.input(filename, inplace=True, backup='.bak'):
if text1_to_search.match(line):
print("match")
print(text1_to_search.sub(replacement1_text, line))
答案 0 :(得分:2)
使用正则表达式,您可以使用捕获组来捕获搜索查询的各个部分,并在结果中使用这些部分。用其他东西替换字符串时,您也可以使用反向引用来引用这些组的值。
通过简单地用括号括起来创建捕获组。您已经在表达式中使用了非捕获组,它们基本上捕获前缀为?:
的组,这将导致它们而不是可用。
因此,在您的情况下,您只需将r\d+
部分用括号括起来:
re.compile(r'#define\s+EPI_VERSION_STR\s+"\d+(?:\.\d+)+\s+\(TOB\)\s+\((r\d+) ASSRT\)"')
# ^^^^^^
然后,在替换字符串中,您可以使用\\1
来引用该值:
replacement1_text = '#define EPI_VERSION_STR "9.130.27.50.1.2.3 (\\1 ASSRT)"'
简化示例:
>>> s = '#define ... "9.130.27.50.1.2.3 (r749679 ASSRT)"'
>>> re.sub('#define .+\((r\d+) ASSRT\)"', '... (\\1 ASSRT)', s)
'... (r749679 ASSRT)'