Python替换列表中的元素

Python替换列表中的元素,python,list,substitution,Python,List,Substitution,我有下面的代码过滤和打印列表。最后的输出是json,格式为name.example.com。我想用name.sub.example.com来代替它,但实际上我很难做到这一点。filterIP是一段可以完全删除元素的代码,我一直在尝试重新使用它来修改元素,它不需要这样处理 def filterIP(fullList): regexIP = re.compile(r'\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$') return filter(lambda i:

我有下面的代码过滤和打印列表。最后的输出是json,格式为name.example.com。我想用name.sub.example.com来代替它,但实际上我很难做到这一点。filterIP是一段可以完全删除元素的代码,我一直在尝试重新使用它来修改元素,它不需要这样处理

def filterIP(fullList):
    regexIP = re.compile(r'\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$')
    return filter(lambda i: not regexIP.search(i), fullList)

def filterSub(fullList2):
    regexSub = re.compile(r'example\.com, sub.example.com')
    return filter(lambda i: regexSub.search(i), fullList2)

groups = {key : filterSub(filterIP(list(set(items)))) for (key, items) in groups.iteritems() }

print(self.json_format_dict(groups, pretty=True))
这就是我没有过滤器时得到的

"type_1": [
    "server1.example.com",
    "server2.example.com"
],
"type_1": [],
这就是我用filterSub得到的

"type_1": [
    "server1.example.com",
    "server2.example.com"
],
"type_1": [],
这就是我想要得到的

"type_1": [
    "server1.sub.example.com",
    "server2.sub.example.com"
],
声明:

regexSub = re.compile(r'example\.com, sub.example.com')
不会做你认为它会做的事。它创建一个已编译的正则表达式,该表达式与string example.com匹配,后跟逗号、空格、string sub、任意字符、string example、任意字符和string com。它不会产生任何类型的替代

相反,您希望编写如下内容,使用re.sub函数执行替换并使用map应用它:

def filterSub(fullList2):
    regexSub = re.compile(r'example\.com')
    return map(lambda i: re.sub(regexSub, "sub.example.com", i),
               filter(lambda i: re.search(regexSub, i), fullList2))

如果所有的例子都像你所列出的那样简单,那么正则表达式可能太过简单了。一个简单的解决方案是使用string.split和.join。这可能会提供更好的性能

在第一个期间首先拆分url:

url = 'server1.example.com'
split_url = url.split('.', 1)  
# ['server1', 'example.com']
然后,您可以使用sub重新加入url:

subbed_url = '.sub.'.join(split_url)
# 'server1.sub.example.com'
当然,您可以同时执行拆分和联接

'.sub.'.join(url.split('.', 1))
或者创建一个简单的函数: 定义子URL: 返回“.sub.”joinurl.split.”,1

要将此应用于列表,可以采取几种方法

列表理解:

subbed_list = [sub_url(url)
               for url in url_list]
映射它:

subbed_list = map(sub_url, url_list)
或者我最喜欢的发电机:

gen_subbed = (sub_url(url)
               for url in url_list)
最后一个看起来像一个列表理解,但增加了一个好处,即您不需要重新生成整个列表。当生成器遍历时,它一次处理一个元素。如果您决定以后确实需要该列表,只需将其转换为如下列表:

subbed_list = list(gen_subbed)

re.sub需要字符串而不是列表。。。很方便,json是一个字符串。。。因此,如果您在将其转换为json后将其传入,它可能会像您需要的那样正常工作,以便正确使用正则表达式。可能在匹配之前添加通配符。我会在控制台中调整正则表达式,直到它正确为止。也许将regex标记添加到问题中有没有一种方法可以像我希望的那样专门重新编译列表?我找到的所有东西都是用于字符串操作的。在打印到json后,我将修改它。或者您可以映射regexSub.sub