web-dev-qa-db-fra.com

Conversion d'une chaîne en une liste de mots?

J'essaie de convertir une chaîne en une liste de mots en utilisant python. Je veux prendre quelque chose comme ceci:

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

Puis convertissez-vous en quelque chose comme ceci:

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

Notez l'omission de la ponctuation et des espaces. Quel serait le moyen le plus rapide de s'y prendre? 

51
rectangletangle

Essaye ça:

import re

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

Comment ça marche:  

De la docs:

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

Renvoie la chaîne obtenue en remplaçant les occurrences les plus à gauche du modèle dans chaîne par la réplique de remplacement. Si le modèle n’est pas trouvé, la chaîne est renvoyée telle quelle. repl peut être une chaîne ou une fonction.

donc dans notre cas: 

motif est tout caractère non alphanumérique.

[\ w] signifie n'importe quel caractère alphanumérique et est égal au jeu de caractères [a-zA-Z0-9_]

a à z, A à Z, 0 à 9 et trait de soulignement. 

nous faisons donc correspondre tout caractère non alphanumérique et le remplaçons par un espace.  

puis on scinde () ce qui scinde chaîne par espace et le convertit en liste 

donc 'bonjour le monde' 

devient 'bonjour le monde'

avec re.sub 

et ensuite ['bonjour', 'monde']

après scission ()

laissez-moi savoir si vous avez des doutes.

68
Bryan

Je pense que c'est le moyen le plus simple pour quiconque de tomber sur ce post compte tenu de la réponse tardive:

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

Faire cela correctement est assez complexe. Pour vos recherches, il est connu sous le nom de tokenization de Word. Vous devriez regarder NLTK si vous voulez voir ce que d'autres ont fait, plutôt que de partir de zéro:

>>> 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'.']
28
Tim McNamara

Le moyen le plus simple:

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

Utiliser string.punctuation pour être complet:

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

Cela gère aussi les nouvelles lignes.

11
mtrw

Eh bien, vous pourriez utiliser

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

Notez que string et list sont des noms de types prédéfinis, vous ne souhaiterez donc probablement pas les utiliser comme noms de variables.

5
Cameron

Une expression régulière pour les mots vous donnerait le plus de contrôle. Vous voudriez bien examiner comment traiter les mots avec des tirets ou des apostrophes, comme "je suis".

3
tofutim

Personnellement, je pense que cela est légèrement plus propre que les réponses fournies

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

Inspiré par la réponse de @ mtrw, mais amélioré pour éliminer la ponctuation aux limites de Word uniquement:

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']
1
Paulo Freitas
list=mystr.split(" ",mystr.count(" "))
1
sanchit

De cette façon, vous éliminez tous les caractères spéciaux en dehors de l'alphabet:

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']

Je ne suis pas sûr que ce soit rapide ou optimal ou même la bonne façon de programmer.

0
BenyaR

Ceci est de ma tentative sur un défi de code qui ne peut pas utiliser regex,

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

Le rôle de l'apostrophe semble intéressant.

0