2017-04-14 152 views
0

我有以下代码正在过滤和打印列表。最终的输出是以name.example.com形式出现的json。我想用name.sub.example.com来代替它,但我实际上很难做到这一点。 filterIP是一个可以完全删除元素的工作代码,我一直试图重复使用该位来修改元素,但不必这样处理。列表中的Python替换元素

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)) 

这是我所得到的不filterSub

"type_1": [ 
    "server1.example.com", 
    "server2.example.com" 
], 

这就是我与filterSub

"type_1": [], 

这就是我试图让

"type_1": [ 
    "server1.sub.example.com", 
    "server2.sub.example.com" 
], 
+1

应用re.sub需要一个字符串不是列表...够交通便利的JSON是一个字符串...所以,如果你在将它传入json之后将它传递给它,它可能只是起作用 –

+1

您需要获得正确的正则表达式。可能在之前添加通配符进行比赛。我会调整控制台中的正则表达式,直到它是正确的。也许添加正则表达式标记问题 – MrJLP

+0

有没有一种方法专门重新编译列表我想要做的方式?我发现的一切都是为了字符串操作。在打印到json之后,我会修改修改。 –

回答

1

声明:

regexSub = re.compile(r'example\.com, sub.example.com') 

不符合您的想法。它创建一个编译后的正则表达式,它匹配字符串“example.com”,后跟逗号,空格,字符串“sub”,任意字符,字符串“example”,任意字符和字符串“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)) 
+0

或者你可以'映射''regexSub.sub' –

0

如果示例都是真正为那些你列为简单,一正则表达式可能是矫枉过正。一个简单的解决方案是使用字符串.split.join。这可能会带来更好的性能。

url = 'server1.example.com' 
split_url = url.split('.', 1) 
# ['server1', 'example.com'] 

然后你可以使用子重返网址:

subbed_url = '.sub.'.join(split_url) 
# 'server1.sub.example.com' 

当然你也可以做分割,并在联接

首先在第一个周期拆分网址同时

'.sub.'.join(url.split('.', 1)) 

或者创建一个简单的功能: 高清sub_url(URL): return'.sub。'join(url.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)