python - cadenas - ¿Convertir una cadena en una lista de palabras?
convertir cadena a lista python (13)
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 desee utilizarlos como sus nombres de variable.
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!''
Luego conviértase a algo como esto:
list = [''This'', ''is'', ''a'', ''string'', ''with'', ''words'']
Observe la omisión de puntuación y espacios. ¿Cuál sería la forma más rápida de resolver esto?
Creo que esta es la forma más sencilla para que cualquier persona tropiece con esta publicación dada la respuesta tardía:
>>> string = ''This is a string, with words!''
>>> string.split()
[''This'', ''is'', ''a'', ''string,'', ''with'', ''words!'']
De esta manera eliminas cada char especial 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 de si esto es rápido u óptimo o incluso la forma correcta de programar.
Esto es de mi intento de un desafío de codificación que no puede usar expresiones regulares,
outputList = "".join((c if c.isalnum() or c=="''" else '' '') for c in inputStr ).split('' '')
El papel del apóstrofo parece interesante.
Hacer esto correctamente es bastante complejo. Para su investigación, se conoce como tokenización de palabras. Debería ver NLTK si quiere ver lo que otros han hecho, en lugar de comenzar 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''.'']
Inspirado por la respuesta de @ mtrw, pero mejorado para eliminar la puntuación solo en los límites de las palabras:
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://.com/.''''''
>>> extract_words(str)
["I''m", ''a'', ''custom-built'', ''sentence'', ''with'', ''tricky'', ''words'', ''like'', ''https://.com'']
La forma más simple:
>>> import re
>>> string = ''This is a string, with words!''
>>> re.findall(r''/w+'', string)
[''This'', ''is'', ''a'', ''string'', ''with'', ''words'']
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
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)
Devuelve la cadena obtenida reemplazando las apariciones no superpuestas más a la izquierda del patrón en cadena por la sustitución reemplazada. Si no se encuentra el patrón, la cadena se devuelve sin cambios. repl puede ser una cadena o una función.
entonces en nuestro caso:
patrón es cualquier carácter no alfanumérico.
[/ w] significa cualquier carácter alfanumérico y es igual al juego de caracteres [a-zA-Z0-9_]
de la aa la z, de la A a la Z, de 0 a 9 y subrayado.
entonces emparejamos cualquier caracter no alfanumérico y lo reemplazamos con un espacio.
y luego 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 surgen dudas.
Puedes intentar hacer esto:
tryTrans = string.maketrans(",!", " ")
str = "This is a string, with words!"
str = str.translate(tryTrans)
listOfWords = str.split()
Una expresión regular de palabras te daría el mayor control. Debería considerar cuidadosamente cómo manejar las palabras con guiones o apóstrofes, como "Yo soy".
Usando string.punctuation
para completar:
import re
import string
x = re.sub(''[''+string.punctuation+'']'', '''', s).split()
Esto maneja nuevas líneas también.
list=mystr.split(" ",mystr.count(" "))