他の文字列の大きなライブラリで特定の文字列 (以降、文字列 A と呼びます) を検索するプログラムを作成することに興味があります。基本的に、文字列 A がライブラリに存在する場合、それは破棄され、ライブラリ内で別の文字列の存在がチェックされます。プログラムは、大規模なライブラリ内に部分文字列として存在しなかった文字列の最終的なリストを提供します。EXACT マッチを見つけるプログラムを作成できましたが、サブストリング検索で部分マッチを可能にするモジュールを追加する必要があります。つまり、部分文字列の 1 つまたは 2 つの文字で問題ありません。文字列 A のリスト (7 文字の文字列 4^7 の異なる文字列の a、t、g、c のすべての順列) は、非常に多様なライブラリでは困難です。
私の最初の考えは、正規表現とおそらくハミング距離アルゴリズムを使用して、これらすべての部分一致を見つけることでした。基本的に、この最初の試みでは、「?」を入力できます。または、問題の文字列 A のすべての位置 (1-7) にワイルドカードを使用しますが、最初の位置にしか取得できません。ワイルドカードを使用すると、問題の特定の文字列 A の部分一致を検索できます。これがこの問題へのアプローチが間違っている場合は、喜んで変更します。別の質問の提案に従って fnmatch を使用しました これは私がこれまでに持っているものです:
from Bio import SeqIO
import fnmatch
import random
import itertools
#Define a splitting string algorithm
def split_by_n(seq,n):
while seq:
yield seq[:n]
seq = seq[n:]
#Import all combinations/permutations from fasta fille, 4^7
my_combinations = []
fasta_sequences = SeqIO.parse(open("Combinations/base_combinations_7.fasta"),'fasta')
for fasta in fasta_sequences:
name, sequence = fasta.id, str(fasta.seq)
x = sequence.lower()
my_combinations.append(x)
primer = "tgatgag"
final = []
#List to make wildcard permutations
wildCard = ['?']
i = list(split_by_n(primer, 1))
for letter in i:
wildCard.append(letter)
del wildCard[1]
final.append(''.join(wildCard))
#Search for wildcard permutation
for entry in final:
filtered = fnmatch.filter(my_combinations, entry)
これは私の望ましい出力です:
プライマー = "tgatgag"
['?', 'g', 'a', 't', 'g', 'a', 'g']
['t', '?', 'a', 't', 'g', 'a', 'g']
['t', 'g', '?', 't', 'g', 'a', 'g']
['t', 'g', 'a', '?', 'g', 'a', 'g']
['t', 'g', 'a', 't', '?', 'a', 'g']
['t', 'g', 'a', 't', 'g', '?', 'g']
['t', 'g', 'a', 't', 'g', 'a', '?']
['agatgag', 'tgatgag', 'cgatgag', 'ggatgag']
['taatgag', 'ttatgag', 'tcatgag', 'tgatgag']
['tgatgag', 'tgttgag', 'tgctgag', 'tggtgag']
['tgaagag', 'tgatgag', 'tgacgag', 'tgaggag']
['tgataag', 'tgattag', 'tgatcag', 'tgatgag']
['tgatgag', 'tgatgtg', 'tgatgcg', 'tgatggg']
['tgatgaa', 'tgatgat', 'tgatgac', 'tgatgag']