Eine Zeichenfolge in eine Liste von Wörtern konvertieren?


73

Ich versuche, eine Zeichenfolge mit Python in eine Liste von Wörtern umzuwandeln. Ich möchte so etwas wie das Folgende nehmen:

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

Dann konvertieren Sie zu so etwas:

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

Beachten Sie das Weglassen von Satzzeichen und Leerzeichen. Was wäre der schnellste Weg, dies zu tun?

Antworten:


94

Versuche dies:

import re

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

Wie es funktioniert:

Aus den Dokumenten:

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

Geben Sie die Zeichenfolge zurück, die durch Ersetzen der nicht ganz überlappenden Muster in der Zeichenfolge ganz links durch die Ersetzungsreplikation erhalten wurde. Wenn das Muster nicht gefunden wird, wird die Zeichenfolge unverändert zurückgegeben. repl kann eine Zeichenfolge oder eine Funktion sein.

also in unserem Fall:

Muster ist ein nicht alphanumerisches Zeichen.

[\ w] bedeutet ein beliebiges alphanumerisches Zeichen und entspricht dem Zeichensatz [a-zA-Z0-9_]

a bis z, A bis Z, 0 bis 9 und Unterstrich.

Daher stimmen wir alle nicht alphanumerischen Zeichen überein und ersetzen sie durch ein Leerzeichen.

und dann teilen wir es (), wodurch die Zeichenfolge nach Leerzeichen aufgeteilt und in eine Liste konvertiert wird

also 'hallo-welt'

wird "Hallo Welt"

mit re

und dann ['Hallo', 'Welt']

nach split ()

Lassen Sie mich wissen, wenn Zweifel auftauchen.


Denken Sie daran, auch mit Apostrophen und Bindestrichen umzugehen, da diese nicht in enthalten sind \w.
Brōtsyorfuzthrāx

2
Möglicherweise möchten Sie auch formatierte Apostrophe und nicht unterbrechende Bindestriche verarbeiten.
Brōtsyorfuzthrāx

91

Ich denke, dies ist der einfachste Weg für alle anderen, die angesichts der späten Antwort über diesen Beitrag stolpern:

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

24
Sie müssen die Interpunktion von den Wörtern trennen und entfernen (z. B. "Zeichenfolge" und "Wörter!"). Dies entspricht nicht den Anforderungen von OP.
Levon

34

Das richtig zu machen ist ziemlich komplex. Für Ihre Forschung wird es als Wort-Tokenisierung bezeichnet. Sie sollten sich NLTK ansehen, wenn Sie sehen möchten, was andere getan haben, anstatt von vorne zu beginnen:

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

17

Der einfachste Weg:

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

14

Der string.punctuationVollständigkeit halber verwenden :

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

Dies behandelt auch Zeilenumbrüche.


7

Nun, du könntest es gebrauchen

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

Beachten Sie, dass beide stringund listNamen von integrierten Typen sind, sodass Sie diese wahrscheinlich nicht als Variablennamen verwenden möchten.


5

Inspiriert von der Antwort von @ mtrw, aber verbessert, um Interpunktion nur an Wortgrenzen zu entfernen:

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

3

Ein regulärer Ausdruck für Wörter würde Ihnen die meiste Kontrolle geben. Sie sollten sorgfältig überlegen, wie Sie mit Wörtern mit Bindestrichen oder Apostrophen wie "Ich bin" umgehen sollen.


2

Persönlich denke ich, dass dies etwas sauberer ist als die Antworten

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


0

Dies ist aus meinem Versuch einer Codierungsherausforderung, die keinen regulären Ausdruck verwenden kann.

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

Die Rolle des Apostrophs scheint interessant.


0

Auf diese Weise eliminieren Sie jedes Sonderzeichen außerhalb des Alphabets:

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

Ich bin mir nicht sicher, ob dies schnell oder optimal ist oder sogar die richtige Art zu programmieren.


-1

Sie können dies versuchen:

tryTrans = string.maketrans(",!", "  ")
str = "This is a string, with words!"
str = str.translate(tryTrans)
listOfWords = str.split()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.