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?

Rechteck
quelle

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.

Bryan
quelle
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!']
Gilgamar
quelle
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'.']
Tim McNamara
quelle
17

Der einfachste Weg:

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

Der string.punctuationVollständigkeit halber verwenden :

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

Dies behandelt auch Zeilenumbrüche.

mtrw
quelle
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.

Cameron
quelle
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']
Paulo Freitas
quelle
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.

tofutim
quelle
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
Akhil Cherian Verghese
quelle
1
list=mystr.split(" ",mystr.count(" "))
Sanchit
quelle
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.

guest201505281433
quelle
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.

BenyaR
quelle
-1

Sie können dies versuchen:

tryTrans = string.maketrans(",!", "  ")
str = "This is a string, with words!"
str = str.translate(tryTrans)
listOfWords = str.split()
user2675185
quelle