2012-08-12 5 views
6

Diciamo che il mio programma riceve un input come una stringa di caratteri che ha qualsiasi tipo di carattere. Ad esempio, "Bob's Bagel Shop". Quindi ottiene un'altra stringa che dice "Fred's Bagel Store". Come posso usare espressioni regolari o qualche altro modulo in python per confrontare questi e avere il mio programma mi dica se almeno 5 (o qualsiasi numero che voglio) dei caratteri sono gli stessi ovunque nella stringa, ma tutti nel stesso ordine, come la parola "Bagel"?Usa le espressioni regolari (o un altro modulo python) per confrontare testo/caratteri?

Grazie.

+0

Sarebbe utile confrontare semplicemente quante parole sono le stesse? Sarebbe molto più efficiente del test per cinque caratteri qualsiasi! –

+0

@BillyMoon Il problema è ... questi sono di solito nomi di business (come McDonald's o qualcosa di haha) ... quindi potrebbe avere caratteri in esso ... ma sì, probabilmente sarebbe più semplice. –

+1

potresti usare regex per determinare cosa consideri una parola (compresi caratteri speciali ecc.), E quindi semplicemente controllare ciascuna parola nella prima stringa contro ogni parola nel secondo. –

risposta

13

C'è un Python standard di classe libreria difflib.SequenceMatcher che contribuirà a risolvere il problema. Ecco un esempio di codice:

from difflib import SequenceMatcher 

s1 = "Bob's Bagel Shop" 
s2 = "Bill's Bagel Shop" 

matcher = SequenceMatcher(a=s1, b=s2) 
match = matcher.find_longest_match(0, len(s1), 0, len(s2)) 

risultati:

Match(a=3, b=4, size=13) # value that 'match' variable holds 

Il risultato mostra che entrambi stringa ha pari sottostringa con 13 lunghezza caratteri (iniziando da char 3-rd in prima stringa e 4 ° char seconda stringa).

È possibile utilizzare questo oggetto risultato partita per ottenere i suoi campi come valori:

match.size # 13 
match.a  # 3 
match.b  # 4 
+0

+1 Una risposta molto ben spiegata. Bel lavoro. – fdomig

+0

Questo è perfetto! Grazie! –

+0

Come posso ottenere la 'dimensione' dall'output? Ho bisogno di quel numero. –

1

è possibile utilizzare itetools.combinations e quindi utilizzare intersection di set per scoprire caratteri corrispondenti da entrambe le stringhe:

from itertools import combinations 
str1="Bob's Bagel Shop" 
str2="Fred's Bagel Store" 

def combi(strs): 
    chars=''.join(strs.split()) 
    lis=[] 
    for x in range(1,len(chars)): 
     for y in combinations(chars,x): 
      if ''.join(y) in chars: 
       lis.append(''.join(y)) 
    return lis   


lis1=combi(str1) 
lis2=combi(str2) 
print max(set(lis1).intersection(set(lis2)),key=len) 

output:

'sBagelS