¿Convertir una cadena a una lista de palabras?

Estoy tratando de convertir una cadena en una lista de palabras usando python. Quiero tomar algo como lo siguiente:

string = 'This is a string, with words!' 

Entonces conviértete en algo como esto:

 list = ['This', 'is', 'a', 'string', 'with', 'words'] 

Note la omisión de puntuación y espacios. ¿Cuál sería la forma más rápida de hacer esto?

Prueba esto:

 import re mystr = 'This is a string, with words!' wordList = re.sub("[^\w]", " ", mystr).split() 

Cómo funciona:

De los documentos:

 re.sub(pattern, repl, string, count=0, flags=0) 

Devuelva la cadena obtenida reemplazando las repeticiones no superpuestas a la izquierda del patrón en la cadena por la respuesta de reemplazo. Si no se encuentra el patrón, la cadena se devuelve sin cambios. repl puede ser una cadena o una función.

así que en nuestro caso:

patrón es cualquier carácter no alfanumérico.

[\ w] significa cualquier carácter alfanumérico y es igual al conjunto de caracteres [a-zA-Z0-9_]

A a z, A a z, 0 a 9 y subrayado.

por lo tanto, combinamos cualquier carácter no alfanumérico y lo reemplazamos con un espacio.

y luego lo dividimos () lo que divide cadena por espacio y lo convierte en una lista

así que ‘hola mundo’

se convierte en ‘hola mundo’

con re.sub

y luego [‘hola’, ‘mundo’]

después de dividir ()

Avísame si surge alguna duda.

Creo que esta es la forma más sencilla para cualquier persona que se encuentre en esta publicación dada la respuesta tardía:

 >>> string = 'This is a string, with words!' >>> string.split() ['This', 'is', 'a', 'string,', 'with', 'words!'] 

Hacer esto correctamente es bastante complejo. Para su investigación, se conoce como palabra tokenización. Debería mirar NLTK si desea ver lo que otros han hecho, en lugar de empezar de cero:

 >>> import nltk >>> paragraph = u"Hi, this is my first sentence. And this is my second." >>> sentences = nltk.sent_tokenize(paragraph) >>> for sentence in sentences: ... nltk.word_tokenize(sentence) [u'Hi', u',', u'this', u'is', u'my', u'first', u'sentence', u'.'] [u'And', u'this', u'is', u'my', u'second', u'.'] 

La forma más sencilla:

 >>> import re >>> string = 'This is a string, with words!' >>> re.findall(r'\w+', string) ['This', 'is', 'a', 'string', 'with', 'words'] 

Usando string.punctuation para completar:

 import re import string x = re.sub('['+string.punctuation+']', '', s).split() 

Esto maneja nuevas líneas también.

Bueno, podrías usar

 import re list = re.sub(r'[.!,;?]', ' ', string).split() 

Tenga en cuenta que tanto la string como la list son nombres de tipos incorporados, por lo que probablemente no quiera usarlos como nombres de variables.

Una expresión regular de palabras le daría el mayor control. Usted querría considerar cuidadosamente cómo tratar las palabras con guiones o apóstrofes, como “Soy”.

Personalmente, creo que esto es un poco más limpio que las respuestas proporcionadas.

 def split_to_words(sentence): return list(filter(lambda w: len(w) > 0, re.split('\W+', sentence))) #Use sentence.lower(), if needed 
 list=mystr.split(" ",mystr.count(" ")) 

Inspirado por la respuesta de @ mtrw, pero mejorado para eliminar la puntuación en los límites de las palabras solamente:

 import re import string def extract_words(s): return [re.sub('^[{0}]+|[{0}]+$'.format(string.punctuation), '', w) for w in s.split()] >>> str = 'This is a string, with words!' >>> extract_words(str) ['This', 'is', 'a', 'string', 'with', 'words'] >>> str = '''I'm a custom-built sentence with "tricky" words like https://stackoverflow.com/.''' >>> extract_words(str) ["I'm", 'a', 'custom-built', 'sentence', 'with', 'tricky', 'words', 'like', 'https://stackoverflow.com'] 

Esto es de mi bash de un desafío de encoding que no puede usar expresiones regulares,

 outputList = "".join((c if c.isalnum() or c=="'" else ' ') for c in inputStr ).split(' ') 

El papel del apóstrofe parece interesante.

De esta manera usted elimina todas las letras especiales fuera del alfabeto:

 def wordsToList(strn): L = strn.split() cleanL = [] abc = 'abcdefghijklmnopqrstuvwxyz' ABC = abc.upper() letters = abc + ABC for e in L: word = '' for c in e: if c in letters: word += c if word != '': cleanL.append(word) return cleanL s = 'She loves you, yea yea yea! ' L = wordsToList(s) print(L) # ['She', 'loves', 'you', 'yea', 'yea', 'yea'] 

No estoy seguro si esto es rápido u óptimo o incluso la forma correcta de progtwigr.

Puedes intentar y hacer esto:

 tryTrans = string.maketrans(",!", " ") str = "This is a string, with words!" str = str.translate(tryTrans) listOfWords = str.split()