2017-11-16 13 views
1

サブストリングにはPまたはKのインデックスがありますが、PRまたはPKではありません。今私は2行のコードを行うことができますが、それはifforループを使用するよりも遅いです。私はre.finditerで非常に速いものを望みますか?re.finditer(RまたはKではRPまたはKPではない)

proseq = "NSDSECPLSHDGYCLHDGVCMYIEALDKYACNCVVGYIGERCQYRDLKWWELRP" 
xxx = [m.start() for m in re.finditer('(R|K)', proseq)] 
yyy = [m.start() for m in re.finditer('(RP|KP)', proseq)] 
print list(set(xxx)^set(yyy)) 
OUT> [40, 27, 44, 47] 

鉱山(とそれがソートされている)よりも高速であるforループ、

proseq = "NSDSECPLSHDGYCLHDGVCMYIEALDKYACNCVVGYIGERCQYRDLKWWELPR" 
cut_sites=[] 
for i in range(0,len(proseq)): 
    if proseq[i]=='K' and proseq[i+1]!='P': 
     cut_sites.append(i) 
    elif proseq[i]=='R' and proseq[i+1]!='P': 
     cut_sites.append(i) 
OUT> [27, 40, 44, 47] 

他の高速な方法は非常に歓迎されています。

+0

'P(?![RK])|(?<!P)K'正規表現 –

答えて

0

正規表現(R|K)([^P]|$)を使用してください。これは、 "RまたはK、P([^P])でない文字、または文字列の終わり($)"の後に自由に読み込まれます。

Thid正規表現は、実際には、別のチェックを必要とせずに結果を提供します。

関連する問題