找出两个字符串的接触部分和非接触部分

4

我有两个字符串对的例子。

YHFLSPYVY      # answer
   LSPYVYSPR   # prediction
+++******ooo


  YHFLSPYVS    # answer
VEYHFLSPY      # prediction
oo*******++

如上所述,我想找到答案(+)和预测(o)中的重叠区域(*)和非重叠区域。

我该如何在Python中实现呢?

我被这个问题卡住了。

import re
# This is of example 1
ans = "YHFLSPYVY"
pred= "LSPYVYSPR"
matches = re.finditer(r'(?=(%s))' % re.escape(pred), ans)
print [m.start(1) for m in matches]
#[]

我希望得到的答案例如1是:

plus_len = 3
star_len = 6
ooo_len = 3

1
你想要第一个重叠的还是最长的重叠? - Aran-Fey
看起来像是最长公共子序列。 - Moon Cheesez
一个单一的字符如果在两个字符串中都出现,那么它也会被视为重叠吗? - Moses Koledoye
@AnupamMohanty:只需plus_len等的值。 - neversaint
你在对齐蛋白质序列吗? - Chris_Rands
显示剩余2条评论
2个回答

3

使用difflib.SequenceMatcher.find_longest_match很容易实现:

from difflib import SequenceMatcher

def f(answer, prediction):
    sm = SequenceMatcher(a=answer, b=prediction)
    match = sm.find_longest_match(0, len(answer), 0, len(prediction))
    star_len = match.size
    return (len(answer) - star_len, star_len, len(prediction) - star_len)

该函数返回一个由三个整数组成的 3 元组 (plus_len, star_len, ooo_len)
f('YHFLSPYVY', 'LSPYVYSPR') -> (3, 6, 3)
f('YHFLSPYVS', 'VEYHFLSPY') -> (2, 7, 2)

SO就像是一支由超级聪明的大脑组成的军队,问题刚一提出,转眼间就有了答案:D! - e-nouri

1
您可以使用 difflib:

import difflib

ans = "YHFLSPYVY"
pred = "LSPYVYSPR"

def get_overlap(s1, s2):
     s = difflib.SequenceMatcher(None, s1, s2)
     pos_a, pos_b, size = s.find_longest_match(0, len(s1), 0, len(s2))
     return s1[pos_a:pos_a+size]

overlap = get_overlap(ans, pred)
plus = ans.replace(get_overlap(ans, pred), "")
oo = pred.replace(get_overlap(ans, pred), "")

print len(overlap)
print len(plus)
print len(oo)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接