如何在匹配正则表达式时捕获数字?

时间:2018-03-10 23:22:51

标签: python regex

我可以使用以下代码编辑文件。我也能匹配正则表达式并替换它。但是,在替换时,我想在(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))

1 个答案:

答案 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)'