So erhalten Sie das erste Wort in der Zeichenfolge


73

Text ist:

WYATT    - Ranked # 855 with    0.006   %
XAVIER   - Ranked # 587 with    0.013   %
YONG     - Ranked # 921 with    0.006   %
YOUNG    - Ranked # 807 with    0.007   %

Ich will nur bekommen

WYATT
XAVIER
YONG
YOUNG

Ich habe es versucht :

(.*)?[ ]

Aber es gibt mir die:

WYATT    - Ranked

Antworten:


166

Regex ist dafür nicht erforderlich. Verwenden Sie einfach some_string.split(' ', 1)[0]oder some_string.partition(' ')[0].


Nicht, wenn die Wörter durch andere Zeichen (z. B. Tabulatoren) getrennt sind.
Orome

1
Solange sie durch dasselbe Zeichen getrennt sind, funktioniert es einwandfrei. Wechseln Sie einfach zu '\t'. Es stimmt, es wird nicht funktionieren, wenn Sie mehrere Trennzeichen haben, obwohl es selbst mit 2 oder 3 Trennzeichen nicht sehr schwierig wäre, splitoder partitionanstelle von Regex zu verwenden.
Silas Ray

2
some_string.split(None, 1)[0]funktioniert, wenn mehr als ein Leerzeichen das erste Wort trennt.
Duanev

1
Stellen Sie sich vor, Sie möchten wirklich das erste Wort, ohne davon auszugehen, dass es das erste Element im geteilten Array ist. Stellen Sie sich my_string = "1 2 3 4 <> coolest" vor. Ich habe Regexs für viele Dinge, aber keine, die angesichts dieser Zeichenfolge "am coolsten" zurückgeben würde. Ich denke nicht, dass eine Aufteilung sinnvoll ist, da "erstes Wort zurückgeben" nichts über die implizite Reihenfolge aussagt, in der sich diese Arbeit in der Liste der Wörter befindet.
Rich Sadowsky

3
Sie können die übrig gebliebene Saite auch mitfirstword, leftoverstring = some_string.split(' ', 1)
Deanresin

21

Wenn Sie sich besonders schlau fühlen möchten, können Sie es wie folgt schreiben:

(firstWord, rest) = yourLine.split(maxsplit=1)

Dies soll das Beste aus beiden Welten bringen:

  • Optimieren Sie die Optimalität, maxsplitwährend Sie mit einem beliebigen Leerzeichen teilen
  • verbesserte Zuverlässigkeit und Lesbarkeit, wie vom Autor der Technik argumentiert .

Ich habe mich irgendwie in diese Lösung verliebt und sie ist allgemein auspackbar, also musste ich sie teilen. :) :)


2
In Python2 können Sie das Schlüsselwortargument möglicherweise nicht verwenden. Daher möchten Sie möglicherweise die firstWord, rest = yourLine.split(None, 1)Lesbarkeit verlieren.
Riesige

Ich mag das, es ist prägnant. Und wenn Sie den Rest der Linie nicht wollen, können Sie verwenden (firstWord, *_) = yourLine.split(maxsplit=1). Verwenden Sie *_anstelle von " _weil" split()eine variable Anzahl von Argumenten gemäß dem maxsplitParameter zurückgibt. Dies ist zukunftssicher.
Huw Walters

2
@HuwWalters Ich verstehe nicht, warum Sie sich schützen, *wenn maxsplit=1es verwendet wird. Es gibt nur eine begrenzte Anzahl von Ergebnissen.
Riesige

3
Weil es Sie vor Codierungsfehlern bewahrt. Wenn Sie den maxsplitWert ändern , aber kein zusätzliches Tupelelement hinzufügen, um den zusätzlichen Wert wie in zu entpacken (firstWord, rest) = yourLine.split(maxsplit=2), erhalten Sie ValueError: too many values to unpack. Ein zusätzlicher Bonus ist, dass Sie keine nicht verwendete Variable erstellen rest.
Huw Walters

11

Du solltest so etwas tun wie:

print line.split()[0]

4
Genau. Aber kleiner Optimierungstipp : print line.split(' ', 1)[0]. Dies begrenzt die Aufteilung auf das erste Wort.
Ricardo Cruz

Was macht die "1" hier?
Algorythmen

@algorythms Kurzschlüsse nach dem Auffinden des ersten geteilten Zeichens, damit Sie den Schwanz der Zeichenfolge nicht durchlaufen.
Silas Ray

10

Verwenden Sie diesen regulären Ausdruck

^\w+

\w+ entspricht 1 bis vielen Zeichen.

\w ist ähnlich wie [a-zA-Z0-9_]

^ zeigt den Anfang einer Zeichenfolge


Über Ihren Regex

Ihre Regex (.*)?[ ]sollte sein ^(.*?)[ ]oder ^(.*?)(?=[ ])wenn Sie den Platz nicht wollen


7

Ich brauche keine regex. string[: string.find(' ')]


1
Das ist ein bisschen esoterischer als splitoder partition, denke ich. Erhalten Sie auf diese Weise eine sinnvolle Leistung oder Gedächtnisgewinne? Sie müssten damit im Wesentlichen zweimal zur ersten Instanz des Tokens iterieren, aber auf der anderen Seite würden Sie nicht mit der neuen Schwanzschnur enden, die Sie einfach wegwerfen ...
Silas Ray

@ sr2222 Ja, es muss zweimal iteriert werden, aber nicht die gesamte Zeichenfolge.
Ricardo Alvaro Lohmann

Weder splitmit einem Token-Limit noch partition.
Silas Ray

1
Dieser Ansatz ist eine nette Optimierung, aber er funktioniert nicht gut, wenn das OP möchte, dass er funktioniert, wenn das erste Wort die gesamte Zeichenfolge ist. Wenn keine Leerzeichen gefunden wird , string.findkehrt -1, um das letzte Zeichen zu entfernen.
Ricardo Cruz

2

Sie benötigen keinen regulären Ausdruck, um eine Zeichenfolge in Leerzeichen zu teilen:

In [1]: text = '''WYATT    - Ranked # 855 with    0.006   %
   ...: XAVIER   - Ranked # 587 with    0.013   %
   ...: YONG     - Ranked # 921 with    0.006   %
   ...: YOUNG    - Ranked # 807 with    0.007   %'''

In [2]: print '\n'.join(line.split()[0] for line in text.split('\n'))
WYATT
XAVIER
YONG
YOUNG
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.