Python 分割、替换字符串

3

我正在编写一个脚本,遇到了障碍。可能有更有效的方法来做这件事,但我对Python还比较新手。我试图创建一个用户生成的IP地址列表。我使用print来查看生成的值是否正确。当我运行这段代码时,print ip_start具有相同的值并且没有更新。我确定这是一个相当简单的修复,但我大脑完全锁定了。

ip_start = raw_input('Please provide the starting IP address for your scan --> ')
start_list = ip_start.split(".")
ip_end = raw_input('Please provide the ending IP address for your scan --> ')
end_list = ip_end.split(".")
top = int(start_list[3])
bot = int(end_list[3])
octet_range = range(top,bot)
print octet_range
for i in octet_range:
    print i
    print "This the top:" + str(top)
    ip_start.replace(str(top),str(i))
    print ip_start

这只适用于传统的IPv4吗?为什么您省略了IPv6地址? - Hyperboreus
仅支持IPV4。这只是一个学习Python的项目。 - user2565554
2个回答

8
字符串上的replace方法不会在原地修改字符串。实际上,没有任何东西会在原地修改字符串;它们是不可变的。这在Python教程的“字符串”一节中有解释。
它所做的是返回一个新的字符串,其中完成了替换。来自文档的说明:

str.replace(old, new[, count])

返回将所有子字符串old替换为new的字符串的副本。如果给定可选参数count,则仅替换前count个出现。

因此,你需要的是:
ip_start = ip_start.replace(str(top),str(i))

我知道了,该死!谢谢你的帮助! - user2565554
基本上,每次迭代中变量 ip_start 都会分配一个新值,但原始对象从未被修改,而是创建了一个新的对象? - user2565554
@user2565554:没错。ip_start 现在是新值的名称,而没有任何东西命名(未更改的)原始值(这意味着它是垃圾,并将自动删除)。 - abarnert
在你的代码中,你可能_想要_在某个地方保留原始内容(因为否则那个replace只会在第一次有效,因为top不再出现了...),这意味着你可能想要每次通过循环使用_不同的_名称来进行替换,例如 ip_current = ip_start.replace(str(top), str(i)) - abarnert
谢谢!我正想问这个问题! - user2565554

1

ip_start.replace(...)——就像其他所有的str方法一样——不会修改ip_start。相反,它会返回一个修改后的字符串,如果你想要改变它,那么你必须将其分配给ip_start


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接