앞의 대답보다 약간 덜 일반적입니다. 하지만 흥미로운 문제처럼 보였다, 그래서 나는 어쨌든 그것을 시도 거라고 생각 :
import re
def find_start_of(needle, haystack):
"""
@param needle Search on first char of string
@param haystack Longer string to search in
Look for first char of needle in haystack; return offset
"""
if needle=='':
return 0
offs = haystack.find(needle[0])
if offs==-1:
return len(haystack)
else:
return offs
def find_end_of(lst, letterset):
"""
@param lst Chars to search for
@param letterset String to search through
lst contains some chars of letterset in order;
Return offset in letterset of last char of lst
"""
offs = 0
for ch in lst:
t = letterset.find(ch, offs)
if t==-1:
raise ValueError('letterset (%s) is not an ordered superset of lst (%s)' % (letterset, lst))
else:
offs = t+1
return offs-1
def alignSeq(s1, s2):
"""
@param s1 A string consisting of letters and hyphens
@param s2 A string containing only letters
The letters in s1 are an in-sequence subset of s2
Returns s1 with the missing letters from s2 inserted
in-sequence and greedily preceding hyphens.
"""
# break s1 into letter-chunks and hyphen-chunks
r = '([^-]*)([-]*)' # string of letters followed by string of hyphens
seq = re.findall(r, s1) # break string into list of tuples
seq = seq[:-1] # discard final empty pair
# eg: "MAT--LA-B" becomes [('MAT', '--'), ('LA', '-'), ('B', '')]
# find start of corresponding letter-chunks in s2
offs = 0
chunkstart = []
for letters,hyphens in seq:
offs += find_start_of(letters, s2[offs:])
chunkstart.append(offs)
offs += find_end_of(letters, s2[offs:]) + 1
# get end+1 for each letter-chunk
chunkend = chunkstart[1:] + [len(s2)]
# get replacement letter-chunks
chunks = [s2[st:en] for st,en in zip(chunkstart,chunkend)]
# do replacement for each chunk
outp = [c+s[1] for c,s in zip(chunks, seq)]
return ''.join(outp)
그런
alignSeq('MAT--LA-B','MATATLAB')
반환
'MATAT--LA-B'
당신은 더 명확히 할 필요가, 나는 생각한다. 'seq1 = MAT-LA-C'와'seq2 = MATATLAB'에 대해 원하는 것은 무엇입니까? – khachik
시퀀스 2가 시퀀스 1을 초과하면 시퀀스 1에 삽입하려고합니다. 시퀀스 2를 변경하고 싶지 않습니다. –
a -는 무엇을 나타내는가? 시퀀스 문자열이나리스트입니까? 더 많은 정보가 없으면 Seq1을 새로 고침하여 Seq2와 일치 시키려고하는 것 같습니다. – kevpie