【发布时间】:2014-10-24 18:15:24
【问题描述】:
我有兴趣创建一个程序,该程序将在其他字符串的大型库中搜索某个字符串(以下称为字符串 A)。基本上,如果字符串 A 存在于库中,它将被丢弃,并在库中检查另一个字符串的存在。然后程序会给我一个最终的字符串列表,这些字符串在大型库中不作为子字符串存在。我能够制作一个找到 EXACT 匹配的程序,但我需要添加一个额外的模块,允许子字符串搜索以允许部分匹配。即,一个或两个子字符串字符就可以了。字符串 A 的列表(它们都是 a,t,g,c 在 7 个字母的字符串 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']
【问题讨论】:
-
我不明白,有什么问题吗?您几乎已经完成了该程序。
-
我对其进行了更具体的编辑,但我无法获得 ?在我想要的所有位置......问题的底部。
-
您可能需要考虑查看
itertools模块,特别是itertools.permutations(range(7), 2)将为您提供字符串中所有可能的通配符位置以替换为?。您可能还想精简您对该问题的介绍。 -
这有帮助,但它给了我所有的排列。我想像这样冻结字符串的其余部分:?GATGAG = 4 of them, G?ATGAG 另外四个......等等。
-
为此,我会再次查看
itertools。itertools.combinations_with_replacement(['a','c','t','g'],2)将为每对两个创建一个迭代器,您可以将其换出到permutation调用提供的每个解决方案中。
标签: python regex string biopython hamming-distance