2012-08-12 13 views
6

Digamos que mi programa recibe una entrada como una cadena de caracteres que tiene cualquier tipo de carácter. Por ejemplo, 'Bob's Bagel Shop'. Luego recibe otra cadena que dice 'Fred's Bagel Store'. ¿Cómo puedo usar expresiones regulares o algún otro módulo en Python para comparar esto y hacer que mi programa me diga si al menos 5 (o cualquier número que desee) de los caracteres son los mismos en cualquier lugar de la cadena, pero todos en mismo orden, como la palabra 'Bagel'?¿Usar expresiones regulares (u otro módulo de python) para comparar texto/caracteres?

Gracias.

+0

¿Sería útil simplemente comparar cuántas palabras son iguales? ¡Sería mucho más eficiente que probar cinco personajes! –

+0

@BillyMoon El problema es ... estos suelen ser nombres comerciales (como McDonald's o algo así como jaja) ... por lo que podría tener caracteres en él ... pero sí, probablemente sería más simple. –

+1

puede usar regex para determinar lo que considera que es una palabra (incluidos los caracteres especiales, etc.), y luego simplemente verifique cada palabra en la primera cadena contra cada palabra en la segunda. –

Respuesta

13

Hay una norma de clase biblioteca de Python difflib.SequenceMatcher que le ayudará a resolver su problema. Aquí está un ejemplo de código:

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

Resultado:

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

El resultado muestra que tanto la cadena tiene igual subcadena con 13 caracteres de longitud (a partir de char 3-rd en primera cadena y 4-ésimo Char en segunda cuerda).

Puede utilizar este objeto resultado del partido para conseguir sus campos como valores:

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

+1 Una respuesta muy bien explicada. Buen trabajo. – fdomig

+0

¡Esto es perfecto! ¡Gracias! –

+0

¿Cómo puedo obtener el 'tamaño' de la salida? Necesito ese número. –

1

puede utilizar itetools.combinations y luego usar intersection de conjuntos para averiguar caracteres coincidentes de ambas cadenas:

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) 

de salida:

'sBagelS 
Cuestiones relacionadas