2016-07-27 2 views
4

Ich habe zwei Beispiele für zwei SaitenFinden kontaktieren und nicht berührenden Teil von zwei Strings

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


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

Wie oben erwähnt Ich mag würde den Überlappungsbereich (*) und nicht-überlappenden Bereich in Antwort finden (+) und Vorhersage (o).

Wie kann ich es in Python tun?

Ich bin fest mit diesem

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] 
#[] 

Die Antwort, die ich zum Beispiel zu bekommen hoffen 1:

plus_len = 3 
star_len = 6 
ooo_len = 3 
+1

Wollen Sie die erste Überlappung? Oder die längste Überlappung? –

+0

Wollen Sie auch die Zeichenfolge mit * + o oder nur die Werte von plus_len usw.? –

+0

Sieht aus wie [längste gemeinsame Subsequenz] (https://en.wikipedia.org/wiki/Longest_common_subsequence_problem) –

Antwort

3

Es ist einfach, mit 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) 

Die Funktion gibt ein 3-Tupel von ganzen Zahlen (plus_len, star_len, ooo_len):

f('YHFLSPYVY', 'LSPYVYSPR') -> (3, 6, 3) 
f('YHFLSPYVS', 'VEYHFLSPY') -> (2, 7, 2) 
+0

SO ist wie eine Armee von super intelligenten Köpfen, nicht einmal eine Sekunde und die Frage wurde beantwortet: D! –

1

können Sie difflib verwenden:

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) 
Verwandte Themen