在Python中仅替换正则表达式字符串的一部分的方法

在Python中仅替换正则表达式字符串的一部分的方法,python,regex,replace,re,Python,Regex,Replace,Re,我正在使用一个文本文件,该文件的文本布局如下: SCN DD1251 UPSTREAM DOWNSTREAM FILTER NODE LINK NODE LINK LINK DD1271 C DD1271 R

我正在使用一个文本文件,该文件的文本布局如下:

SCN DD1251       
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        DD1271      C           DD1271    R                                     
        DD1351      D           DD1351    B                                     
                    E                                                           
                                                                                
SCN DD1271       
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        DD1301      T           DD1301    A                                     
        DD1251      R           DD1251    C                                     
                                                                                
SCN DD1301       
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        DD1271      A           DD1271    T                                     
                    B                                                           
                    C                                                           
                    D                                                           
                                                                                
SCN DD1351       
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
                    A           DD1251    D                                     
        DD1251      B                                                           
                    C   
我目前正在使用以下正则表达式模式来匹配节点,后跟5个空格和下面的字母,如下所示:

DD1251      B

[A-Z]{2}[0-9]{3}[0-9A-Z]      [A-Z]
我的目标是用下划线替换5个空格,如下所示:

DD1251_B
我正试图通过以下代码实现这一点:

def RemoveLinkSpace(input_file, output_file, pattern):
  with open(str(input_file) + ".txt", "r") as file_input:
    with open(str(output_file) + ".txt", "w") as output: 
        for line in file_input:
               line = pattern.sub("_", line)
               output.write(line)

upstream_pattern = re.compile(r"[A-Z]{2}[0-9]{3}[0-9A-Z]      [A-Z]")

RemoveLinkSpace("File1","File2",upstream_pattern)
但是,这会产生一个文本文件,该文件看起来如下所示:

SCN DD1251       
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        _      C           DD1271    R                                     
        _      D           DD1351    B                                     
                    E                                                           
                                                                                
SCN DD1271       
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        _      T           DD1301    A                                     
        _      R           DD1251    C      

                           

我的问题是,有没有一种方法仍然可以搜索整个正则表达式,但只替换其中包含的空格?

我们可以按组替换,但您忽略了这一点\1表示第一组,\2表示第二组 所以在搜索模式中([A-Z]{2}[0-9]{3}[0-9A-Z])是第一个模式,([A-Z])是第二个模式。
而且,组1和组2之间的空间不是5,而是6。所以我搜索了5个空间

def RemoveLinkSpace(input_file, output_file, pattern):
  with open(str(input_file) + ".txt", "r") as file_input:
    with open(str(output_file) + ".txt", "w") as output: 
        for line in file_input:
               line = re.sub(pattern,r"\1_\2", line)
               output.write(line)

upstream_pattern = re.compile(r"([A-Z]{2}[0-9]{3}[0-9A-Z])[ ]{5,}([A-Z])")


RemoveLinkSpace("in","out", upstream_pattern)

我们可以分组替换,你错过了这一点\1表示第一组,\2表示第二组 所以在搜索模式中([A-Z]{2}[0-9]{3}[0-9A-Z])是第一个模式,([A-Z])是第二个模式。
而且,组1和组2之间的空间不是5,而是6。所以我搜索了5个空间

def RemoveLinkSpace(input_file, output_file, pattern):
  with open(str(input_file) + ".txt", "r") as file_input:
    with open(str(output_file) + ".txt", "w") as output: 
        for line in file_input:
               line = re.sub(pattern,r"\1_\2", line)
               output.write(line)

upstream_pattern = re.compile(r"([A-Z]{2}[0-9]{3}[0-9A-Z])[ ]{5,}([A-Z])")


RemoveLinkSpace("in","out", upstream_pattern)
有帮助吗?有帮助吗?