2013-10-31 19 views
5

Ho un utente che immette due stringhe e quindi voglio controllare se ci sono caratteri simili e se c'è, ottenere la posizione in cui si verifica la prima somiglianza, senza usare la ricerca o la funzione di indice.Cercando di trovare una corrispondenza in due stringhe - Python

Di seguito è quello che ho finora ma non funziona completamente. Con quello che ho finora, sono in grado di trovare le somiglianze ma non sono sicuro di come trovare la posizione di tali somiglianze senza utilizzare la funzione indice.

string_a = "python" 

string_b = "honbe" 

same = [] 

a_len = len(string_a) 
b_len = len(string_b) 

for a in string_a: 
    for b in string_b: 

     if a == b: 
      same.append(b)   

print (same) 

In questo momento l'output è:

['h', 'o', 'n'] 

Quindi, in pratica quello che sto chiedendo è, come posso trovare la posizione di quei personaggi senza utilizzare la funzione di Python Index?

risposta

5

Si tratta di un caso d'uso perfetto per difflib.SequenceMatcher:

import difflib 

string_a = 'python' 
string_b = 'honbe' 

matcher = difflib.SequenceMatcher(a=string_a, b=string_b) 
match = matcher.find_longest_match(0, len(matcher.a), 0, len(matcher.b)) 

L'oggetto match avrà gli attributi a, b e size, dove a è l'indice iniziale dal stringa matcher.a, b è l'indice iniziale da matcher.b e size è la lunghezza della corrispondenza.

Ad esempio:

>>> match 
Match(a=3, b=0, size=3) 
>>> matcher.a[match.a:match.a+match.size] 
'hon' 
>>> match.a 
3 
>>> match.b 
0 
+1

Hey c'è un modo per ottenere il numero di partite? – Mohsin

2

Si dovrebbe effettuare un'iterazione sugli indici:

for i in range(len(string_a)): 
    for j in range(len(string_b)): 
     if string_a[i] == string_b[j]: 
      same.append((i, j, string_b[j])) 

questo creerà una lista di tuple che assomigliano:

[ (3, 0, "h"), ... ] 
1
def find_similarity(string_a, string_b): 
    for ia, ca in enumerate(string_a): 
     for ib, cb in enumerate(string_b): 
      if ca == cb: 
       return ia, ib, ca 

Se volete tutti partite, invece di il primo, è possibile sostituire l'istruzione return con una dichiarazione yield e iterare sui risultati, o semplicemente:

matches = list(find_similarity(string_a, string_b))

In quest'ultimo caso, si ottiene:

list(find_similarity(string_a, string_b)) 
=> [(3, 0, 'h'), (4, 1, 'o'), (5, 2, 'n')] 
3

È possibile risolvere questo problema utilizzando una combinazione di list comprehension e itertools.

import itertools 
string_a = 'hello_world' 
string_b = 'hi_low_old' 

same = [ i for i,x in enumerate(itertools.izip(string_a,string_b)) if all(y==x[0] for y in x)] 

In [38]: same 
Out[38]: [0, 3, 4, 7] 

Qui mettiamo a confronto l'elemento due stringhe per elemento e restituire tutti gli indici che sono stati trovati ad essere simili. L'output può essere facilmente modificato per includere i caratteri corrispondenti, ecc. Questo metodo si adatta facilmente per confrontare più parole.

+0

Semplice e geniale. – peixe

Problemi correlati