2013-06-24 9 views
10

Próbuję znaleźć liczbę wystąpień słowa w ciągu znaków.Znajdowanie wystąpień słowa w ciągu w pytonie 3

word = "dog" 
str1 = "the dogs barked" 

użyłem następujących policzyć wystąpień:

count = str1.count(word) 

Zagadnienie to chcę dokładne dopasowanie. Więc liczba tego zdania będzie równa 0. Czy to możliwe?

Odpowiedz

16

Jeśli idziesz na wydajność:

import re 
count = sum(1 for _ in re.finditer(r'\b%s\b' % re.escape(word), input_string)) 

nie trzeba tworzyć żadnych wykazów pośrednich (w przeciwieństwie split()), a więc będzie pracować wydajnie dla dużych input_string wartości.

Posiada również korzyść działa poprawnie z interpunkcją - to właściwie powrót 1 jak zliczania dla frazy "Mike saw a dog." (mając na uwadze, argumentless split() nie będzie). Używa flagi regex \b, która pasuje do granic słów (przejścia między \w a.k.a [a-zA-Z0-9_] i cokolwiek innego).

Jeśli musisz się martwić o języki spoza zestawu znaków ASCII, może zajść potrzeba dopasowania wyrażeń regularnych, aby odpowiednio pasowały do ​​nie-słów w tych językach, ale w przypadku wielu aplikacji byłoby to nadmierną komplikacją, aw wielu innych przypadkach ustawienie flag unicode i/lub ustawień regionalnych dla regex byłoby wystarczające.

+0

pracował jak urok! Nie wiem, dlaczego jest coś takiego. Czy możesz wyjaśnić, co dokładnie się dzieje lub gdzie mogę tego szukać? Nigdy nie widziałem pętli for z podkreśleniem. Dzięki! – lost9123193

+0

@ lost9123193 '_' jest często używany jako symbol zastępczy dla pętli :). Jestem pewien, że Amber może to wyjaśnić lepiej: p – TerryA

+1

@ lost9123193 - "_" jest po prostu zmienną obojętną, co oznacza "nie dbam o wartość tutaj". W tym przypadku używam go, ponieważ zawsze podsumowujemy '1' dla liczby; w rzeczywistości nie zwracamy uwagi na obiekty dopasowania zwrócone przez 're.finditer()'. – Amber

3

Użyj listowych:

>>> word = "dog" 
>>> str1 = "the dogs barked" 
>>> sum(i == word for word in str1.split()) 
0 

>>> word = 'dog' 
>>> str1 = 'the dog barked' 
>>> sum(i == word for word in str1.split()) 
1 

split() zwraca listę wszystkich słów w zdaniu. Następnie używamy listy do zrozumienia, ile razy słowo pojawia się w zdaniu.

+1

Do kogo downvoted: jeśli masz zamiar downvote, to zwykle dobry pomysł, komentarz wyjaśniający, dlaczego przynajmniej zostawić . – Amber

+0

@LennartRegebro Nie oznacza, że ​​powinieneś głosować za odpowiedzią. Odpowiedź jest poprawna – TerryA

+0

@LennartRegebro To nie jest przydatne stwierdzenie. Ludzie, którzy wysyłają odpowiedzi na StackOverflow często chcą się uczyć tak samo, jak robią to ludzie, którzy publikują pytania; przydatne i przydatne informacje zwrotne są ważną częścią tego. – Amber

8

Można użyć str.split() konwertować zdanie na listę słów:

a = 'the dogs barked'.split() 

To stworzy listę:

['the', 'dogs', 'barked'] 

Następnie można policzyć dokładnie zdarzeniami z wykorzystaniem list.count():

a.count('dog') # 0 
a.count('dogs') # 1 

Jeśli musi działać z interpunkcja, jo możesz używać wyrażeń regularnych. Na przykład:

import re 
a = re.split(r'\W', 'the dogs barked.') 
a.count('dogs') # 1 
+0

Jest to prawdopodobnie najprostsza metoda, ale należy pamiętać, że nie powiedzie się ona dla ciągów zawierających znaki interpunkcyjne obok zliczanego słowa. – Amber

+0

Wyrażenie "\ W" nie powiedzie się dla żadnych obcych słów, takich jak kawiarnia, co jest wadą. –

+0

@LennartRegebro nie ustawi flagi Unicode? – grc

2

Musisz podzielić zdanie na słowa. Dla przykładu możesz to zrobić tylko z

words = str1.split() 

Ale do prawdziwego użycia słowa potrzebujesz czegoś bardziej zaawansowanego, który również obsługuje interpunkcja. W przypadku większości języków zachodnich można uciec przed zastąpieniem całej interpunkcji spacjami przed wykonaniem str1.split().

Będzie to działać również w języku angielskim w prostych przypadkach, ale należy pamiętać, że słowo "ja" zostanie podzielone na dwa słowa: "I" i "m", a powinno być podzielone na "I" i "rano". Ale to może być przesada dla tej aplikacji.

W przypadku innych przypadków, takich jak język azjatycki lub rzeczywiste używanie języka angielskiego w czasie rzeczywistym, warto skorzystać z biblioteki, która dzieli słowo na części.

Wtedy masz listę słów, a można zrobić

count = words.count(word) 
+0

Haha, teraz to zostało wycofane bez powodu. Podejrzewam dziecinadę. ;-) Ale mam już ponad 20 tys., Więc nie mam nic przeciwko temu. –

+0

Powiedziawszy to teraz, nie padłem. – TerryA

+0

OK, cieszę się, że to słyszę. –

2
import re 

word = "dog" 
str = "the dogs barked" 
print len(re.findall(word, str)) 
0

Poniżej znajduje się prosty przykład, gdzie możemy wymienić żądane słowo z nowym słowem, a także dla żądanej liczby wystąpień:

import string 

def censor(text, word):<br> 
    newString = text.replace(word,"+" * len(word),text.count(word)) 
    print newString 

print censor("hey hey hey","hey") 

wyjście będzie: +++ +++ +++

pierwszy parametr w funkcji jest search_string. Druga to nowa_stracja, która zastąpi twoją wyszukiwarkę. Trzecia i ostatnia to liczba wystąpień.

+0

co to jest
? – RetroCode

0

Rozważmy przykład: s = "suvotisuvojitsuvo". Jeśli chcesz policzyć wyraźną liczbę "suvo" i "suvojit", użyj metody count() ... count distinct ie) nie policz suvojit suvo .. licz tylko samotne "suvo" .

suvocount = s.count("suvo") // #output: 3 
suvojitcount = s.count("suvojit") //# output : 1 

Następnie znajdź samotną liczbę suwów, którą musisz zanegować z liczby suvojitów.

lonelysuvo = suvocount - suvojicount //# output: 3-1 -> 2 
0

To byłoby moje rozwiązanie z pomocą opinii:

word = str(input("type the french word chiens in english:")) 
str1 = "dogs" 
times = int(str1.count(word)) 
if times >= 1: 
    print ("dogs is correct") 
else: 
    print ("your wrong") 
Powiązane problemy