在Python 3中替换字符串

时间:2019-03-15 17:01:13

标签: python python-3.x

我正在尝试像这样替换python中的字符串:

        private_ips.replace("{",'') 

我回来的错误是:

Traceback (most recent call last):
  File ".\aws_ec2_list_instances.py", line 39, in <module>
    private_ips.replace("{",'')
AttributeError: 'set' object has no attribute 'replace'

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

private_ipsset对象。您只能在字符串上使用替换。

要将集合表示为字符串,请使用以下代码段:

private_ips_as_string = '{' + ', '.join(str(elem) for elem in private_ips) + '}'

答案 1 :(得分:0)

让我们备份一下...

tree = objectpath.Tree(instance) 
private_ips = set(tree.execute('$..PrivateIpAddress'))

您的最初问题是,您特定地将返回值转换为一个集合。如果您不需要一组,则不要将其转换为一个,也不要将其转换回对您更有用的东西。由于您未能提供Minimal, complete, verifiable example,因此我们无法修复所有问题,但在此我将进行直观的介绍...

  • tree.execute返回IP地址列表。
  • 您正在使用set删除列表中的重复地址。

如果是这样,那么您就可以了。要以字符串形式获取地址,我想您要遍历集合中的项目:

for ip_addr in private_ips:
    # Handle ip_addr, a single IP address seen as a str.

如果您需要排列地址,则始终可以使用以下方式转换回列表

private_ips = list(private_ips)

...,如果您知道确切地有一个想要作为字符串的地址,则可以使用

single_ip = list(private_ips)[0]

...或者直接从函数的返回值中获取它:

single_ip = tree.execute('$..PrivateIpAddress')[0]

要解释您发生了什么

  • 您调用了一个返回某种序列的函数。
  • 您已将该序列转换为集合,这是删除重复项的常用技术。
  • 您试图从集合中删除括号,就好像它是一个字符串一样。

问题在于,一组没有括号。这些花括号在符号上是方便的。它们仅存在于数据类型的__repr__(输出字符串表示形式)中,而不存在于集合本身中。您不能操作该表示。这就像尝试通过编辑问题文本来删除该问题的上投票箭头和下投票箭头:您不能这样做,因为它们是交付框架的一部分。

类似地,您不能删除字符串两端的引号,因为它们不是字符串的一部分。

要去除括号,您可以使用set退出:进入内部并将内容作为单个元素拉出。