web-dev-qa-db-ger.com

Einen String in eine Liste von Wörtern konvertieren?

Ich versuche, eine Zeichenfolge mithilfe von Python in eine Liste von Wörtern zu konvertieren. Ich möchte etwas wie das Folgende nehmen:

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

Dann konvertiere zu etwas wie das:

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

Beachten Sie die Auslassung von Satzzeichen und Leerzeichen. Was wäre der schnellste Weg, um dies zu erreichen? 

51
rectangletangle

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)

Gibt die Zeichenfolge zurück, die durch Ersetzen der am weitesten links liegenden Vorkommen des Musters in Zeichenfolge durch die Ersetzungsreferenz erhalten wird. Wird das Muster nicht gefunden, wird der String unverändert zurückgegeben. repl kann eine Zeichenfolge oder eine Funktion sein.

so in unserem Fall: 

muster ist ein beliebiges nicht alphanumerisches Zeichen.

[\ w] steht für ein beliebiges alphanumerisches Zeichen und entspricht dem Zeichensatz [a-zA-Z0-9_]

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

Also passen wir jedes nicht alphanumerische Zeichen an und ersetzen es durch ein Leerzeichen.  

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

so 'Hallo-Welt' 

wird "Hallo Welt"

mit resub 

und dann ['Hallo', 'Welt']

nach dem aufteilen ()

lassen Sie mich wissen, wenn Zweifel aufkommen.

68
Bryan

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

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

Dies richtig zu machen, ist ziemlich komplex. Für Ihre Forschung ist es als Word-Tokenisierung bekannt. Sie sollten auf NLTK schauen, 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'.']
28
Tim McNamara

Der einfachste Weg:

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

Verwendung von string.punctuation zur Vollständigkeit:

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

Dies behandelt auch Zeilenumbrüche.

11
mtrw

Nun, du könntest es gebrauchen

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

Beachten Sie, dass sowohl string als auch list Namen von eingebauten Typen sind. Daher möchten Sie diese wahrscheinlich nicht als Variablennamen verwenden.

5
Cameron

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

3
tofutim

Ich persönlich finde das etwas sauberer 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

Inspiriert von der Antwort von @ mtrw, jedoch verbessert, um Interpunktion nur an Word-Grenzen 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']
1
Paulo Freitas
list=mystr.split(" ",mystr.count(" "))
1
sanchit

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 ist.

0
BenyaR

Dies ist von meinem Versuch einer Codierungsherausforderung, die Regex nicht verwenden kann,

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

Die Rolle des Apostroph scheint interessant zu sein.

0