2017-02-03 1 views
1

私はキーがidsであり、その値がKとMだけでなく、私にとって重要ではないいくつかの文字で作られた長いシーケンスである辞書も持っています。文字の並びのモチーフを見つける

li = {id1: "KKMKMKMKJASGKKKMOOGBMMMMMMMMMMMMMMMMMM", 
id2:"MMKFJDFKFGKJKMKMKMKMKMJKJHFKMKMKM"} 

私はそれが偶数か奇数ちょうど等しいまたは6よりも長く、それはまた、同じキーを持つ辞書にする必要があります可能性があり、少なくとも6の長さを「KMKMKM」のモチーフを見つけたいが、配列全体の代わりに、値はモチーフのリストでなければなりません。次の例のようにします。

results = {id1: ["KMKMKMK"], id2: ["KMKMKMKMKM", "KMKMKM"] } 

私はこのコードを書いていますが、興味のあるモチーフは返していません。

{k: re.findall(r'(?:KM){6,1000}', v) for k, v in li.items()} 
+0

あなたがモチーフとはどういう意味ですか? –

+0

KとMの小さな配列を探しています。 – user7249622

+0

それらは交互になり、 'K'で始める必要がありますか? – schwobaseggl

答えて

0

あなたが探しているものを、このです:下のあなたのコメントへの返信で

import re 

stringA = "KKMKMKMKJASGKKKMOOGBMMMMMMMMMMMMMMMMMM"; 
motifs = "KMKMKM"; 

m = re.search(motifs, stringA) 
if m: 
    print(motifs); 


stringA = "KKMKMKMKJASGKKKMOOGBMMMMMMMMMMMMMMMMMM"; 
motifs = "KMKMKM"; 
i = 0; 

while True: 
    seq = stringA[i:] 
    i = i + 1; 
    if (seq.startswith(motifs)): 
     print(seq); 
    if (len(stringA) == i): 
     break; 
+0

ありがとう。長さ6のものだけを返しますが、長さは返しません。 6歳以上が必要です。 – user7249622

3

この1つは仕事をしていません:

((?:KM){3,}K?) 

説明:アクションで

(   : group 1 
    (?:KM){3,} : non capture group, 3 or more times KM 
    K?   : optional K 
)    : end group 1 

import re 

li = {'id1': "KKMKMKMKJASGKKKMOOGBMMMMMMMMMMMMMMMMMM", 
'id2':"MMKFJDFKFGKJKMKMKMKMKMJKJHFKMKMKM"} 

res = {k: re.findall(r'((?:KM){3,}K?)', v) for k, v in li.items()} 
print(res) 

出力:

{'id2': ['KMKMKMKMKM', 'KMKMKM'], 'id1': ['KMKMKMK']} 
関連する問題