2013-07-06 4 views
9

Sto cercando di analizzare il contenuto di una stringa. Se ha una punteggiatura mista nella parola, voglio sostituirli con spazi.Tentativo di contare le parole in una stringa

Ad esempio, se Johnny.Appleseed! È: un * buon & il contadino viene immesso come input quindi dovrebbe dire che ci sono 6 parole, ma il mio codice lo vede solo come 0 parole. Non sono sicuro di come rimuovere un carattere errato.

FYI: Sto usando Python 3, anche io non riesco a importare le librerie

string = input("type something") 
stringss = string.split() 

    for c in range(len(stringss)): 
     for d in stringss[c]: 
      if(stringss[c][d].isalnum != True): 
       #something that removes stringss[c][d] 
       total+=1 
print("words: "+ str(total)) 
+3

Si sta complicando troppo questo. È possibile ripetere una stringa utilizzando un ciclo normale per. – squiguy

+0

'd' è un singolo carattere di una stringa, * non * e indice. E non stai chiamando il metodo '.isalnum()', facendo semplicemente riferimento a esso. E usa 'se non' per testare il negativo, non'! = True'. –

+0

E perché non puoi importare alcuna libreria ...? –

risposta

14
soluzione basata

ciclo semplice:

strs = "Johnny.Appleseed!is:a*good&farmer" 
lis = [] 
for c in strs: 
    if c.isalnum() or c.isspace(): 
     lis.append(c) 
    else: 
     lis.append(' ') 

new_strs = "".join(lis) 
print new_strs   #print 'Johnny Appleseed is a good farmer' 
new_strs.split()   #prints ['Johnny', 'Appleseed', 'is', 'a', 'good', 'farmer'] 

Soluzione migliore:

Utilizzo di regex:

>>> import re 
>>> from string import punctuation 
>>> strs = "Johnny.Appleseed!is:a*good&farmer" 
>>> r = re.compile(r'[{}]'.format(punctuation)) 
>>> new_strs = r.sub(' ',strs) 
>>> len(new_strs.split()) 
6 
#using `re.split`: 
>>> strs = "Johnny.Appleseed!is:a*good&farmer" 
>>> re.split(r'[^0-9A-Za-z]+',strs) 
['Johnny', 'Appleseed', 'is', 'a', 'good', 'farmer'] 
+1

Come è regex una soluzione migliore, è più veloce? –

+0

@MarkusMeskanen Naturalmente, quasi il doppio più veloce. –

+0

Questa non è nemmeno la buona soluzione regex: P –

1
for ltr in ('!', '.', ...) # insert rest of punctuation 
    stringss = strings.replace(ltr, ' ') 
return len(stringss.split(' ')) 
10

Ecco una soluzione a una riga che non richiede l'importazione di alcuna libreria.
Sostituisce caratteri non alfanumerici (come la punteggiatura) con spazi, quindi la stringa è split s.

Ispirato da "Python strings split with multiple separators"

>>> s = 'Johnny.Appleseed!is:a*good&farmer' 
>>> words = ''.join(c if c.isalnum() else ' ' for c in s).split() 
>>> words 
['Johnny', 'Appleseed', 'is', 'a', 'good', 'farmer'] 
>>> len(words) 
6 
3

provare questo: analizza il word_list utilizzando re, poi crea un dizionario di parola: apparizioni

import re 
word_list = re.findall(r"[\w']+", string) 
print {word:word_list.count(word) for word in word_list} 
1

So che questa è una vecchia questione, ma ...Cosa ne pensi di questo?

string = "If Johnny.Appleseed!is:a*good&farmer" 

a = ["*",":",".","!",",","&"," "] 
new_string = "" 

for i in string: 
    if i not in a: 
     new_string += i 
    else: 
     new_string = new_string + " " 

print(len(new_string.split(" "))) 
1

Come utilizzare il contatore dalle raccolte?

import re 
from collections import Counter 

words = re.findall(r'\w+', string) 
print (Counter(words))