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?
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.
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!']
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'.']
Der einfachste Weg:
>>> import re
>>> string = 'This is a string, with words!'
>>> re.findall(r'\w+', string)
['This', 'is', 'a', 'string', 'with', 'words']
Verwendung von string.punctuation
zur Vollständigkeit:
import re
import string
x = re.sub('['+string.punctuation+']', '', s).split()
Dies behandelt auch Zeilenumbrüche.
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.
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.
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']
list=mystr.split(" ",mystr.count(" "))
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.
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.