我有兴趣创建一个程序,该程序将在其他字符串的大型库中搜索某个字符串(以下称为字符串A)。基本上,如果字符串A存在于库中,它将被丢弃,并且将在库中检查另一个字符串的存在。然后程序会给我一个最终的字符串列表,这些字符串在大型库中不作为子字符串存在。我能够创建一个找到EXACT匹配的程序,但我需要添加一个额外的模块,允许子字符串搜索允许部分匹配。即,一个或两个子串字符将是正常的。字符串A的列表(它们是7个字母的字符串中的a,t,g,c的排列4 ^ 7个不同的字符串)在高度多样化的库中存在困难。
我最初的想法是使用正则表达式和汉明距离算法来找到所有那些部分匹配。基本上这第一次尝试允许我放一个"?"或者通配符到问题字符串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)
这是我想要的输出:
primer =" 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']
答案 0 :(得分:0)
以下是2元素替换的示例解决方案:
primer = 'cattagc'
bases = ['a','c','g','t']
# this is the generator for all possible index combinations
p = itertools.permutations(range(len(primer)), 2)
# this is the list of all possible base pair combinations
c = list(itertools.combinations_with_replacement(bases, 2))
results = []
for i1, i2 in p:
for c1, c2 in c:
temp = list(primer)
temp[i1], temp[i2] = c1, c2
results.append(''.join(temp))
这将创建所有可能的替代品,用于分析原始引物的任何两个元素。