使用Python 3 re.sub进行字符串替换

时间:2015-10-06 15:44:43

标签: regex python-3.x

p = re.compile('Dhcp Server .*? add scope .*? (.*?) ')
test_str = 'Dhcp Server \\server1 add scope 10.0.1.0 255.255.255.0 "area1"'
subst = "255.255.254.0"
re.sub(p, subst, test_str)

输出为255.255.254.0。我想要得到的是:

Dhcp Server \\server1 add scope 10.0.1.0 255.255.254.0 "area1"'

我不能简单地使用字符串替换,因为server110.0.1.0将是动态的。

使用Python 3.5时如何获得理想的结果?我看了其他SO问题,但没有找到一个像我的问题。

3 个答案:

答案 0 :(得分:1)

您可以使用捕获群组

test_str = 'Dhcp Server \\server1 add scope 10.0.1.0 255.255.255.0 "area1"'

print re.sub(r'(Dhcp Server .*? add scope [\d.]+) [\d.]+ (.*)', r"\1 255.255.254.0 \2", test_str)

我们正在将替换位置之前的文本捕获到\1,并在\2中提供替换后的部分。

<强>输出:

Dhcp Server \\server1 add scope 10.0.1.0 255.255.254.0 "area1"

答案 1 :(得分:1)

你倒退了。您可以将捕获组用于要复制的表达式部分,而不是要替换的部分。然后在替换字符串中使用反向引用来复制它们。

p = re.compile('(Dhcp Server .*? add scope .*? ).*? ')
test_str = 'Dhcp Server \\server1 add scope 10.0.1.0 255.255.255.0 "area1"'
subst = r"\g<1>255.255.254.0 "
re.sub(p, subst, test_str)

答案 2 :(得分:1)

或者你可以匹配你想要的部分,然后重建线(特别是如果你想知道你是否已经取代):

p = re.compile('(Dhcp Server .*? add scope .*? )(.*?)( .*)')
test_str = 'Dhcp Server \\server1 add scope 10.0.1.0 255.255.255.0 "area1"'
subst = "255.255.254.0"
match = p.match(test_str)
if match:
  replaced = match.group(1) + subst + match.group(3)