841 Stimmen

Strings in Wörter mit mehreren Wortbegrenzern aufteilen

Ich denke, was ich tun möchte, ist eine ziemlich häufige Aufgabe, aber ich habe keine Referenz im Web gefunden. Ich habe Text mit Satzzeichen und möchte eine Liste der Wörter.

"Hey, you - what are you doing here!?"

sollte sein

['hey', 'you', 'what', 'are', 'you', 'doing', 'here']

Aber Pythons str.split() funktioniert nur mit einem Argument, also habe ich alle Wörter mit dem Satzzeichen, nachdem ich mit Leerzeichen aufgeteilt habe. Irgendwelche Ideen?

7 Stimmen

13 Stimmen

Python's str.split() funktioniert auch ohne Argumente überhaupt

4voto

Statt der Verwendung einer re-Modul-Funktion re.split können Sie dasselbe Ergebnis erzielen, indem Sie die Methode series.str.split von Pandas verwenden.

Erstellen Sie zunächst eine Serie mit dem obigen String und wenden Sie dann die Methode auf die Serie an.

thestring = pd.Series("Hey, you - what are you doing here!?") thestring.str.split(pat = ',|-')

Der Parameter pat nimmt die Trennzeichen entgegen und gibt den aufgeteilten String als Array zurück. Hier werden die beiden Trennzeichen mit einem | (oder Operator) übergeben. Das Ergebnis lautet wie folgt:

[Hey, you , what are you doing here!?]

2 Stimmen

Es handelt sich nicht um eine Frage der Ausführlichkeit, sondern vielmehr um die Tatsache, dass eine ganze Bibliothek importiert werden muss (die ich übrigens liebe), um eine einfache Aufgabe nach der Konvertierung eines Strings in eine Panda-Serie auszuführen. Nicht sehr "Occam-freundlich".

4voto

Jeremy Anifacc Punkte 833

In Python 3 können Sie die Methode von PY4E - Python for Everybody verwenden.

Beide Probleme können wir lösen, indem wir die String-Methoden lower, punctuation und translate verwenden. Translate ist die subtilste Methode. Hier ist die Dokumentation für translate:

Ihr_String.translate(Ihr_String.maketrans(fromstr, tostr, deletestr))

Ersetzen Sie die Zeichen in fromstr durch das Zeichen an derselben Position in tostr und löschen Sie alle Zeichen, die in deletestr enthalten sind. Die Parameter fromstr und tostr können leere Strings sein, und der Parameter deletestr kann weggelassen werden.

Sie können die "Punktuierung" sehen:

In [10]: import string

In [11]: string.punctuation
Out[11]: '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'  

Für Ihr Beispiel:

In [12]: Ihr_Str = "Hey, you - what are you doing here!?"

In [13]: Zeile = Ihr_Str.translate(Ihr_Str.maketrans('', '', string.punctuation))

In [14]: Zeile = Zeile.lower()

In [15]: Wörter = Zeile.split()

In [16]: print(Wörter)
['hey', 'you', 'what', 'are', 'you', 'doing', 'here']

Weitere Informationen finden Sie unter:

2 Stimmen

Die Methode translate() und maketrans() von Strings sind interessant, aber diese Methode versagt beim "Aufteilen an Trennzeichen" (oder Leerzeichen): zum Beispiel wird "Es gab einen großen Höhleneinsturz" fälschlicherweise das Wort "Höhleinsturz" anstelle des erwarteten "Höhle" und "Einsturz" produzieren... Daher tut dies nicht, was die Frage verlangt.

0 Stimmen

Genau wie @EricLebigot kommentiert hat. Die oben genannte Methode erfüllt nicht besonders gut, was die Frage verlangt.

3voto

Leon Starr Punkte 364

Ich erneuere meine Kenntnisse in Python und brauchte dasselbe. Die Lösung mit findall mag besser sein, aber ich habe das geschrieben:

tokens = [x.strip() for x in data.split(',')]

0 Stimmen

Clever, sollte bei allen englischen grammatikalischen Konstruktionen funktionieren, an die ich denken kann, außer einem Gedankenstrich ohne Leerzeichen—dies zum Beispiel. (Lösbar.)

3voto

Ritesh Sinha Punkte 790

Mit maketrans und übersetzen können Sie es einfach und ordentlich machen

import string
specials = ',.!?:;"()<>[]#$=-/'
trans = string.maketrans(specials, ' '*len(specials))
body = body.translate(trans)
words = body.strip().split()

0 Stimmen

Tolle Antwort wie für Python >= 3.6

3voto

tgray Punkte 8420

Ein weiterer Weg, dies zu erreichen, ist die Verwendung des Natural Language Tool Kits (nltk).

import nltk
data= "Hey, you - what are you doing here!?"
word_tokens = nltk.tokenize.regexp_tokenize(data, r'\w+')
print word_tokens

Dies druckt: ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

Der größte Nachteil dieser Methode ist, dass Sie das nltk-Paket installieren müssen.

Die Vorteile sind, dass Sie eine Menge spaßiger Dinge mit dem Rest des nltk-Pakets machen können, sobald Sie Ihre Tokens haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X