2016-06-07 26 views
3

我有一個字符串列表。在python中查找帶多個後綴的通用前綴結尾

A = [ 
    'kite1.json', 
    'kite1.mapping.json', 
    'kite1.analyzer.json', 
    'kite2.json', 
    'kite3.mapping.json', 
    'kite3.mapping.mapping.json', 
    'kite3.mapping.analyzer.json', 
] 

我需要找到共同的前綴與所有的.json.mapping.json.analyzer.json結束。

這裏,kite1 & kite3.mapping得到滿足。但是kite2不是,因爲它只以.json結尾。

我怎樣才能找到那些以.json,.mapping.json,.analyzer.json全部結尾的前綴。

+0

你輸入的內容是否應該像上面那樣? –

+0

沒有..沒有訂單 – aerokite

+3

不使用正則表達式就可以輕鬆解決此問題。 'regex'標籤的原因是什麼?這是一項要求嗎? – soon

回答

3

如果這是code-golf,我要得:

def ew(sx): 
    return set([s[:-len(sx)] for s in A if s.endswith(sx)]) 

ew('.analyzer.json') & ew('.mapping.json') & ew('.json') 

ew()功能遍歷A,發現具有給定後綴結尾的所有元素和剝離後綴關閉,返回一組結果。

使用它,我只是計算從三個後綴中的每一個產生的集合的交集。 (&是交點的運算符。)

爲簡潔起見,我將「ends with」縮寫爲​​ew,將「suffix」縮寫爲sx

表達式s[:-len(sx)]的意思是「s的子字符串從0開始,並從末尾轉到len(sx)個字符」,這具有剪切後綴的效果。

+0

你能解釋這是如何工作的嗎? – Keatinge

+0

@Keatinge - 當然我可以解釋它。我寫的! – Malvolio

+0

我不是在問你是否理解你寫的代碼,我希望你會包含一個解釋,以便我和其他人能夠理解它是如何工作的。就像一個普通英語的解釋一樣,「這是有效的,因爲它先做x然後做y」。例如,':-len(sx)'做什麼,'ew'和'sx'代表什麼,''做什麼。實際功能本身是做什麼的,爲什麼你稱它爲3次?等等等 – Keatinge

1

那麼,你需要的是收集一組前綴爲['.json', '.mapping.json', '.analyzer.json']每個後綴,然後只把這些集的交集:

In [1]: A = [ 
    ...: 'kite1.json', 
    ...: 'kite1.mapping.json', 
    ...: 'kite1.analyzer.json', 
    ...: 'kite2.json', 
    ...: 'kite3.mapping.json', 
    ...: 'kite3.mapping.mapping.json', 
    ...: 'kite3.mapping.analyzer.json', 
    ...: ] 

In [2]: suffixes = ['.json', '.mapping.json', '.analyzer.json'] 

In [3]: prefixes = {s: set() for s in suffixes} 

In [4]: for word in A: 
    ....:  for suffix in suffixes: 
    ....:   if word.endswith(suffix): 
    ....:    prefixes[suffix].add(word[:-len(suffix)]) 
    ....:    

In [5]: prefixes 
Out[5]: 
{'.analyzer.json': {'kite1', 'kite3.mapping'}, 
'.json': {'kite1', 
    'kite1.analyzer', 
    'kite1.mapping', 
    'kite2', 
    'kite3.mapping', 
    'kite3.mapping.analyzer', 
    'kite3.mapping.mapping'}, 
'.mapping.json': {'kite1', 'kite3', 'kite3.mapping'}} 

In [6]: prefixes['.json'] & prefixes['.mapping.json'] & prefixes['.analyzer.json'] 
Out[6]: {'kite1', 'kite3.mapping'} 
1

使用re.matchcapturing groups提取所有比賽爲您的每一個圖案。然後把所得集的intersection

import re 

s1, s2, s3 = (
    set(m.group(1) for m in (re.match(pattern, s) for s in A) if m) 
    for pattern in (
     r'^(.+)\.json$',   # group(1) is the part within '()' 
     r'^(.+)\.mapping\.json$', 
     r'^(.+)\.analyzer\.json$' 
    ) 
) 

result = list(s1 & s2 & s3) # intersection 
# ['kite3.mapping', 'kite1'] 
0
string = "\n".join(A) 

json_prefices = re.findall(r"(.*?)\.json", string) 
mapping_json_prefices = re.findall(r"(.*?)\.mapping\.json", string) 
analyzer_json_prefices = re.findall(r"(.*?)\.analyzer\.json", string) 

result = list(set(json_prefices) & set(mapping_json_prefices) 
       & set(analyzer_json_prefices))