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?
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.
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!']
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'.']
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']
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.
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.
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".
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']
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.
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.
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
Vous pouvez essayer de faire ceci:
tryTrans = string.maketrans(",!", " ")
str = "This is a string, with words!"
str = str.translate(tryTrans)
listOfWords = str.split()