¿Cómo contar el número de palabras en una oración, ignorar números, puntuación y espacios en blanco?

¿Cómo voy a contar las palabras en una oración? Estoy usando Python.

Por ejemplo, podría tener la cadena:

string = "I am having a very nice 23!@$ day. " 

Eso sería 7 palabras. Tengo problemas con la cantidad aleatoria de espacios después de cada palabra, así como cuando se trata de números o símbolos.

str.split() sin ningún argumento se divide en series de caracteres de espacio en blanco:

 >>> s = 'I am having a very nice day.' >>> >>> len(s.split()) 7 

De la documentación enlazada:

Si sep no se especifica o es None , se aplica un algoritmo de división diferente: las ejecuciones de espacios en blanco consecutivos se consideran como un solo separador, y el resultado no contendrá cadenas vacías al principio o al final si la cadena tiene espacios en blanco iniciales o finales.

Puedes usar regex.findall() :

 import re line = " I am having a very nice day." count = len(re.findall(r'\w+', line)) print (count) 

Este es un simple contador de palabras usando expresiones regulares. La secuencia de comandos incluye un bucle que puede terminar cuando haya terminado.

 #word counter using regex import re while True: string =raw_input("Enter the string: ") count = len(re.findall("[a-zA-Z_]+", string)) if line == "Done": #command to terminate the loop break print (count) print ("Terminated") 
 s = "I am having a very nice 23!@$ day. " sum([i.strip(string.punctuation).isalpha() for i in s.split()]) 

La statement anterior revisará cada parte del texto y eliminará las puntuaciones antes de verificar si la parte es realmente una cadena de alfabetos.

Ok, aquí está mi versión de hacer esto. Noté que quieres que tu salida sea 7 , lo que significa que no quieres contar caracteres especiales y números. Así que aquí está el patrón de expresiones regulares:

 re.findall("[a-zA-Z_]+", string) 

Donde [a-zA-Z_] significa que coincidirá con cualquier carácter entre az (minúsculas) y AZ (mayúsculas).


Sobre los espacios. Si desea eliminar todos los espacios adicionales, simplemente haga lo siguiente:

 string = string.rstrip().lstrip() # Remove all extra spaces at the start and at the end of the string while " " in string: # While there are 2 spaces beetwen words in our string... string = string.replace(" ", " ") # ... replace them by one space! 

¿Qué hay de usar un bucle simple para contar las ocurrencias de número de espacios?

 txt = "Just an example here move along" count = 1 for i in txt: if i == " ": count += 1 print(count) 
  def wordCount(mystring): tempcount = 0 count = 1 try: for character in mystring: if character == " ": tempcount +=1 if tempcount ==1: count +=1 else: tempcount +=1 else: tempcount=0 return count except Exception: error = "Not a string" return error mystring = "I am having a very nice 23!@$ day." print(wordCount(mystring)) 

la salida es 8