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
Vor
quelle

Antworten:

166

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

Silas Ray
quelle
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. :) :)

Enorm
quelle
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]
Nado
quelle
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

Anirudha
quelle
7

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

Ricardo Alvaro Lohmann
quelle
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
Lev Levitsky
quelle