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?
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.
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!']
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'.']
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']
Utiliser string.punctuation
pour être complet:
import re
import string
x = re.sub('['+string.punctuation+']', '', s).split()
Cela gère aussi les nouvelles lignes.
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.
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".
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']
list=mystr.split(" ",mystr.count(" "))
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.
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.