从原始字符串返回两个不匹配的序列

时间:2018-02-11 05:12:18

标签: python string function search

我正在寻找一些代码来返回原始字符串中两个不匹配的所有序列,以便找到与我输入的原始序列相似的蛋白质序列的部分。例如,在LELFLKEF中搜索LKLD应该返回: LELF LKEF LFLK 我已经看过各种python方法来做到这一点,但我似乎无法做任何工作。

Search for string allowing for one mismatch in any location of the string

String regex two mismatches Python

Ambiguous substring with mismatches

1 个答案:

答案 0 :(得分:1)

一种简单的方法是浏览序列并为查询的每个对齐计算hamming distance' LKLD'到主题序列! LELFLKEF'。在链接的维基百科文章中有汉明距离计算的示例实现。完成后,您的代码将执行以下操作:

# hamming distance
d = lambda s1, s2: sum(e1 != e2 for e1, e2 in zip(s1, s2))

subject = 'LELFLKEF'
query = 'LKLD'
for i in range(len(subject)-len(query)+1):
    aligned_subject = subject[i:i+len(query)]
    if d(aligned_subject, query) == 2:
         print(aligned_subject)

输出:

LELF
LFLK
LKEF

请注意,这是一个天真的解决方案,有足够的优化空间,但它适用于简单的情况和相当小的字符串。生成列表的精简版本:

s='LELFLKEF'
q='LKLD'
d= lambda s1, s2: sum(e1 != e2 for e1, e2 in zip(s1, s2))
[s[i:i+len(q)] for i in range(len(s)-len(q)+1) if d(s[i:i+len(q)],q) == 2]

for循环遍历两个字符串的所有可能无空位对齐:

0
LELFLKEF
||||
LKLD
 1
LELFLKEF
 ||||
 LKLD
  2
LELFLKEF
  ||||
  LKLD
   3
LELFLKEF
   ||||
   LKLD
    4
LELFLKEF
    ||||
    LKLD

alignment of biological sequences的问题也有很多实现,因此您可能还想探索一些处理空位对齐和more complicated modeling of substitutions

之类的更复杂的技术