在 Python 中仅替换正则表达式字符串的一部分的方法
Way to substitute only part of a regex string in Python
我正在处理一个文本文件,其文本布局如下:
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 宽 space 和后面的字母,如下所示:
DD1251 B
[A-Z]{2}[0-9]{3}[0-9A-Z] [A-Z]
我的目标是用下划线替换 5 宽 space,如下所示:
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
我的问题是,有没有办法仍然搜索整个正则表达式,然后只替换包含在中的 spaces?
我们可以分组替换,你错过了这一点。 \1表示第一组,\2表示第二组
因此在搜索模式中 ([A-Z]{2}[0-9]{3}[0-9A-Z]) 是第一个模式,([A-Z]) 是第二个模式。
此外,组 1 和组 2 之间的 space 不存在 5,只有 6。所以我搜索 5 继续 space。
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"_", 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)
我正在处理一个文本文件,其文本布局如下:
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 宽 space 和后面的字母,如下所示:
DD1251 B
[A-Z]{2}[0-9]{3}[0-9A-Z] [A-Z]
我的目标是用下划线替换 5 宽 space,如下所示:
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
我的问题是,有没有办法仍然搜索整个正则表达式,然后只替换包含在中的 spaces?
我们可以分组替换,你错过了这一点。 \1表示第一组,\2表示第二组
因此在搜索模式中 ([A-Z]{2}[0-9]{3}[0-9A-Z]) 是第一个模式,([A-Z]) 是第二个模式。
此外,组 1 和组 2 之间的 space 不存在 5,只有 6。所以我搜索 5 继续 space。
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"_", 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)