2013-06-24 14 views
10

Sto cercando di trovare il numero di occorrenze di una parola in una stringa.Trovare occorrenze di una parola in una stringa in python 3

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

ho usato il seguente per contare le occorrenze:

count = str1.count(word) 

Il problema è che voglio una corrispondenza esatta. Quindi il conteggio per questa frase sarebbe 0. È possibile?

risposta

16

se si sta andando per l'efficienza:

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

Questo non ha bisogno di creare elenchi intermedi (a differenza split()) e quindi sarà lavorare in modo efficiente per grandi input_string valori.

ha anche il vantaggio di lavorare correttamente con punteggiatura - tornerà correttamente 1 come il conteggio per la frase "Mike saw a dog." (mentre un argumentless split() no). Utilizza il flag di espressione regolare \b, che corrisponde ai limiti di parola (transizioni tra \w a.k.a [a-zA-Z0-9_] e qualsiasi altra cosa).

Se è necessario preoccuparsi delle lingue oltre il set di caratteri ASCII, potrebbe essere necessario regolare l'espressione regolare per abbinare correttamente caratteri non di parole in quelle lingue, ma per molte applicazioni questa sarebbe una complicazione, e in molti altri casi l'impostazione dell'unicode e/o dei flag locali per l'espressione regolare sarebbe sufficiente.

+0

ha funzionato come un fascino! Non so perché c'è un downvote. Potresti spiegare cosa sta succedendo esattamente o dove potrei cercare questo? Non ho mai visto un ciclo for con un carattere di sottolineatura. Grazie! – lost9123193

+0

@ lost9123193 '_' è spesso usato come segnaposto per i loop :). Sono sicuro che Amber potrebbe spiegarlo meglio: p – TerryA

+1

@ lost9123193 - Un '_' è semplicemente una variabile fittizia, un modo per dire" In realtà non mi interessa il valore qui ". In questo caso, lo sto usando perché sommiamo sempre '1's per il conteggio; non ci interessa davvero gli oggetti match restituiti da 're.finditer()'. – Amber

3

utilizzare un elenco di comprensione:

>>> 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() restituisce un elenco di tutte le parole in una frase. Quindi usiamo una comprensione delle liste per contare quante volte la parola appare in una frase.

+1

A chi downvoted questo: se avete intenzione di downvote, di solito è una buona idea, almeno lasciare un commento che spiega perché . – Amber

+0

@LennartRegebro Non significa che dovresti downvotare la risposta. La risposta è corretta – TerryA

+0

@LennartRegebro Questa non è una dichiarazione utile. Le persone che inviano risposte su StackOverflow spesso vogliono imparare proprio come fanno le persone che fanno domande; un feedback utile e attuabile è una parte importante di questo. – Amber

8

È possibile utilizzare str.split() per convertire la condanna a una lista di parole:

a = 'the dogs barked'.split() 

Questo creerà la lista:

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

si può quindi contare il numero di occorrenze esatte utilizzando list.count():

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

Se è necessario lavorare con la punteggiatura, si puoi usare espressioni regolari. Ad esempio:

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

Questo è probabilmente il metodo più semplice, ma si noti che non riuscirà per le stringhe che includono la punteggiatura accanto alla parola contata. – Amber

+0

Un'espressione "\ W" avrà esito negativo per qualsiasi parola straniera come café, che è uno svantaggio. –

+0

@LennartRegebro non aggiusterà il flag unicode? – grc

2

È necessario suddividere la frase in parole. Ad esempio, si si può fare con un semplice

words = str1.split() 

Ma per l'utilizzo reale parola che ti serve qualcosa di più avanzato che gestisce anche la punteggiatura. Per la maggior parte delle lingue occidentali puoi fare a meno di sostituire tutti i segni di punteggiatura con spazi prima di fare str1.split().

Questo funzionerà anche per l'inglese in casi semplici, ma si noti che "I'm" sarà diviso in due parole: "I" e "m", e in effetti dovrebbe essere suddiviso in "I" e "am". Ma questo potrebbe essere eccessivo per questa applicazione.

Per altri casi, come la lingua asiatica, o l'uso effettivo dell'inglese del mondo reale, è possibile che si desideri utilizzare una libreria che divida la parola per voi.

allora avete una lista di parole, e si può fare

count = words.count(word) 
+0

Haha, ora questo è stato downvoted senza motivo. Sospetto l'infantilismo. ;-) Ma ho già più di 20k, quindi non mi dispiace, downvote su. –

+0

Solo andando a dirlo ora, non ho fatto downvot. – TerryA

+0

OK, sono felice di sentirlo. –

2
import re 

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

Qui di seguito è un semplice esempio in cui siamo in grado di sostituire la parola desiderata con la nuova parola e anche per il numero desiderato di occorrenze:

import string 

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

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

uscita sarà: +++ +++ +++

il primo parametro in funzione è search_string. Il secondo è new_string che sostituirà la stringa search_string. Terzo e ultimo è il numero di occorrenze.

+0

cosa è
per? – RetroCode

0

Consideriamo l'esempio s = "suvotisuvojitsuvo". Se non si conta il conteggio distinto "suvo" e "suvojit" allora si usa il metodo count() ... conteggio distinto cioè) non si conta il suvojit per suvo .. si conta solo il solitario "suvo" .

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

Quindi trovare il conteggio di suvo solitario che si deve annullare dal conteggio di suvojit.

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

Questa sarebbe la mia soluzione con l'aiuto dei commenti:

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