Convertir 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 ce qui suit:

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

Puis convertir en quelque chose comme ceci:

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

Notez l'omission de ponctuation et d'espaces. Quel serait le moyen le plus rapide d'y arriver?

44
demandé sur hippietrail 2011-05-31 04:09:24

13 réponses

Essayez ceci:

import re

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

Comment cela fonctionne:

À partir des documents:

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

Renvoie la chaîne obtenue en remplaçant les occurrences les plus à gauche de pattern in string par le REPL de remplacement. Si le motif n'est pas trouvé, string est retourné inchangé. repl peut être une chaîne ou une fonction.

Donc, dans notre cas :

Pattern est un caractère non alphanumérique.

[\w] signifie tout caractère alphanumérique et est égal au jeu de caractères [A-zA-Z0-9_]

A à z, A à Z, 0 à 9 et soulignement.

Nous faisons donc correspondre n'importe quel caractère non alphanumérique et le remplaçons par un espace .

Et puis nous le divisons () qui divise la chaîne par l'espace et la convertit en une liste

Donc "bonjour-Monde"

Devient 'bonjour le monde'

Avec le feu.sous -

, puis ['bonjour' , 'world']

Après split ()

Faites-moi savoir si des doutes surgissent.

60
répondu Bryan 2018-04-11 15:51:25

Je pense que c'est le moyen le plus simple pour quelqu'un d'autre qui trébuche 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!']
53
répondu gilgamar 2012-12-06 00:22:28

Pour le faire correctement est assez complexe. Pour votre recherche, il est connu comme mot tokenization. Vous devriez regarder NLTK si vous voulez voir ce que les 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'.']
27
répondu Tim McNamara 2011-05-31 00:15:21

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']
13
répondu JBernardo 2011-05-31 02:19:14

En utilisant string.punctuation pour être complet:

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

Cela gère également les retours à la ligne.

11
répondu mtrw 2011-05-31 00:29:48

Eh bien, vous pourriez utiliser

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

Notez que string et list sont des noms de types intégrés, donc vous ne voulez probablement pas les utiliser comme noms de variables.

4
répondu Cameron 2011-05-31 00:26:25

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

3
répondu tofutim 2011-05-31 00:14:40
list=mystr.split(" ",mystr.count(" "))
1
répondu sanchit 2015-08-11 15:24:10

Inspiré par la réponse de @mtrw, mais amélioré pour éliminer la ponctuation aux limites des mots seulement:

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
répondu Paulo Freitas 2017-06-08 09:55:37

C'est de ma tentative sur un défi de codage 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
répondu guest201505281433 2015-05-28 06:30:26

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 si c'est rapide ou optimal ou même la bonne façon de programmer.

0
répondu BenyaR 2017-08-12 18:32:07

Personnellement, je pense que c'est un peu 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
0
répondu Akhil Cherian Verghese 2018-05-18 05:47:09

Vous pouvez essayer de faire ceci:

tryTrans = string.maketrans(",!", "  ")
str = "This is a string, with words!"
str = str.translate(tryTrans)
listOfWords = str.split()
-1
répondu user2675185 2017-06-08 09:06:14