python re.sub using()替换一行中的字符串

时间:2014-10-17 23:22:24

标签: python regex

尝试做一些简单的事情: 我有一个文本文件的行,我知道确切的格式。连续六个整数由空格分隔。

例如:

line = '78 170 180 1 2 3'

我想要做的是用另一个数字替换第四个数字。该替换作为变量传递(即,未知且未经过硬编码):

num_replace_str

所以,我想要一段代码,如:

newline = re.sub(r'\d+\s\d+\s\d+\s(\d+)\s\d+\s\d+\s',num_replace_str,line)

将产生如下结果:

print newline
78 170 180 50 2 3

我只想用字符串num_replace_str(在本例中为num_replace_str = '50')替换我尝试过分组()的第4个数字。

3 个答案:

答案 0 :(得分:1)

好像你可以拆分字符串,插入新值并将' '.join重新组合在一起。

split = line.split()
split[3] = str(50)
new_line = ' '.join(split)

示例:

>>> line = '78 170 180 1 2 3'
>>> split = line.split()
>>> split[3] = str(50)
>>> new_line = ' '.join(split)
>>> print new_line
78 170 180 50 2 3

并不是说这不会保留连续的空格运行。 。 。如果这是一个关键要求,那么正则表达式可能是更好的选择。

答案 1 :(得分:1)

您需要将捕获组用于要保留的行的部分,而不是要替换的部分。然后使用\n将其复制到替换字符串,以复制n组的匹配。

re.sub(r'^((?:\d+\s+){3})\d+', r'\1' + num_replace_str, line)

答案 2 :(得分:1)

您可以使用positive lookahead assertion

>>> import re
>>> line = '78 170 180 1 2 3'
>>> num_replace_str = str(50)
>>> newline = re.sub(r'\d+(?=\s\d+\s\d+$)',num_replace_str,line)
>>> print newline
78 170 180 50 2 3

通过外部regex模块,

>>> import regex
>>> newline = regex.sub(r'(?<=^\d+\s\d+\s\d+\s)\d+',num_replace_str,line)
>>> print newline
78 170 180 50 2 3