2012-08-12 4 views
6

Nehmen wir an, dass mein Programm eine Eingabe wie eine Zeichenkette mit beliebigen Zeichen erhält. Zum Beispiel "Bob's Bagel Shop". Dann wird eine andere Zeichenfolge mit dem Namen "Fred's Bagel Store" angezeigt. Wie kann ich reguläre Ausdrücke oder ein anderes Modul in Python verwenden, um diese zu vergleichen und lassen Sie mich von meinem Programm sagen, ob mindestens 5 (oder eine beliebige Zahl) der Zeichen sind irgendwo in der Zeichenfolge, aber alle in der gleiche Reihenfolge, wie das Wort "Bagel"?Verwenden Sie Reguläre Ausdrücke (oder ein anderes Python-Modul), um Text/Zeichen zu vergleichen?

Danke.

+0

Wäre es sinnvoll, einfach zu vergleichen, wie viele Wörter gleich sind? Es wäre viel effizienter als das Testen von fünf Zeichen! –

+0

@BillyMoon Das Problem ist ... das sind in der Regel Geschäftsnamen (wie McDonalds oder etwas haha) ... so könnte es Zeichen drin haben..aber ja, es wäre wahrscheinlich einfacher. –

+1

können Sie Regex verwenden, um festzustellen, was Sie ein Wort zu sein (einschließlich Sonderzeichen etc ...), und dann einfach überprüfen jedes Wort in der ersten Zeichenfolge gegen jedes Wort in der zweiten. –

Antwort

13

Es gibt eine Python-Standardbibliothek Klasse difflib.SequenceMatcher, die Ihr Problem lösen helfen. Hier ist ein Code-Beispiel:

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

Ergebnis:

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

Das Ergebnis zeigt, dass sowohl Folge gleich String mit 13 Zeichen Länge (ausgehend von 3-rd char in erster Zeichenkette und 4-ten char in zweite Saite).

können Sie dieses Spiel Ergebnis Objekt verwenden, um seine Felder als Werte zu erhalten:

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

+1 Eine sehr gut erklärte Antwort. Gut gemacht. – fdomig

+0

Das ist perfekt! Vielen Dank! –

+0

Wie kann ich die "Größe" von der Ausgabe erhalten? Ich brauche diese Nummer. –

1

Sie itetools.combinations verwenden können und dann intersection von Sätzen verwenden, um von beiden Strings passende Zeichen, um herauszufinden:

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) 

Ausgabe:

'sBagelS 
Verwandte Themen