2012-08-12 9 views
6

Powiedzmy, że mój program otrzymuje dane wejściowe, takie jak ciąg znaków, które mają dowolny typ znaku. Na przykład "Bob's Bagel Shop". Następnie dostaje inny ciąg, który mówi "Sklep Freda Bagel". Jak mogę użyć wyrażeń regularnych lub jakiegoś innego modułu w Pythonie, aby je porównać i aby mój program powiedział mi, czy co najmniej 5 (lub jakakolwiek liczba, którą chcę) znaków są takie same w dowolnym miejscu ciągu, ale wszystkie w samo zamówienie, na przykład słowo "Bagel"?Używaj wyrażeń regularnych (lub innego modułu Pythona) do porównywania tekstu/znaków?

Dzięki.

+0

Czy przydałoby się po prostu porównać ile słów jest takich samych? Byłoby o wiele bardziej wydajne niż testowanie dla pięciu postaci! –

+0

@BillyMoon Problem polega na tym, że są to zazwyczaj nazwy firm (np. McDonald's lub coś w tym stylu haha) ... więc mogą w nim występować postacie .. ale tak, prawdopodobnie byłoby to prostsze. –

+1

możesz użyć wyrażenia regularnego, aby określić, co uważasz za słowo (w tym znaki specjalne itp. ...), a następnie po prostu sprawdź każde słowo w pierwszym łańcuchu przed każdym słowem w drugim. –

Odpowiedz

13

Jest Python średnia klasa biblioteka difflib.SequenceMatcher które pomogą rozwiązać problem. Oto przykładowy kod:

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

Wynik:

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

Wynik pokazuje, że zarówno łańcuch ma równe podciąg z 13 znaków długości (począwszy od 3-rd char w pierwszym ciągiem i 4-ty char w drugi ciąg).

Można użyć tego obiektu wynik meczu, aby dostać swoje pola jako wartości:

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

+1 Bardzo dobrze wyjaśniona odpowiedź. Dobra robota. – fdomig

+0

To jest idealne! Dzięki! –

+0

Jak mogę uzyskać "rozmiar" z wyjścia? Potrzebuję tego numeru. –

1

można użyć itetools.combinations a następnie użyć intersection zestawów, aby dowiedzieć się pasujące znaki z obu ciągów:

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) 

wyjściowa:

'sBagelS 
Powiązane problemy