2017-04-14 194 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)