Teilen Sie die Zeichenfolge basierend auf einem regulären Ausdruck

143

Ich habe die Ausgabe eines Befehls in tabellarischer Form. Ich analysiere diese Ausgabe aus einer Ergebnisdatei und speichere sie in einer Zeichenfolge. Jedes Element in einer Zeile wird durch ein oder mehrere Leerzeichen getrennt. Daher verwende ich reguläre Ausdrücke, um ein oder mehrere Leerzeichen abzugleichen und zu teilen. Zwischen jedem Element wird jedoch ein Leerzeichen eingefügt:

>>> str1="a    b     c      d" # spaces are irregular
>>> str1
'a    b     c      d'
>>> str2=re.split("( )+", str1)
>>> str2
['a', ' ', 'b', ' ', 'c', ' ', 'd'] # 1 space element between!!!

Gibt es einen besseren Weg, dies zu tun?

Nach jedem Split str2wird an eine Liste angehängt.

user2763554
quelle
1
Ich habe diese Frage abgelehnt. Der Grund dafür ist, dass das gegebene Beispiel, obwohl die Frage selbst relevant ist, nicht schwer genug ist, um die angeforderte Lösung wirklich zu erfordern. Eine Regex wäre erforderlich, wenn Sie beispielsweise Wortblöcke oder Zahlenblöcke haben und diese in verschiedene Variablen aufteilen möchten.
Erikbwork
@erikbwork Ich wollte das unerwünschte Leerzeichen in der resultierenden Zeichenfolge entfernen'str2'
user2763554
1
Ja, und das können Sie einfach erreichen str1.split(). Keine Regex erforderlich.
Erikbwork

Antworten:

176

Wenn Sie (, verwenden ), erfassen Sie die Gruppe. Wenn Sie sie einfach entfernen, tritt dieses Problem nicht auf.

>>> str1 = "a    b     c      d"
>>> re.split(" +", str1)
['a', 'b', 'c', 'd']

Es ist jedoch kein regulärer Ausdruck erforderlich, str.splitohne dass ein Trennzeichen angegeben wird, das für Sie durch Leerzeichen aufgeteilt wird. Dies wäre in diesem Fall der beste Weg.

>>> str1.split()
['a', 'b', 'c', 'd']

Wenn Sie wirklich Regex wollten, können Sie dies verwenden ( '\s'stellt Leerzeichen dar und es ist klarer):

>>> re.split("\s+", str1)
['a', 'b', 'c', 'd']

oder Sie finden alle Nicht-Leerzeichen

>>> re.findall(r'\S+',str1)
['a', 'b', 'c', 'd']
Jamylak
quelle
4
Halte es einfach. str.splitist definitiv das Beste: D
Jamylak
Wie kann ich dies verwenden, wenn ich eine Zeichenfolge habe, die mit withspace beginnt und endet? Beispiel: 'abc de'. Dafür kommt die Ausgabe als['', 'a', 'b', 'c', 'de', '']
Rakholiya Jenish
@ RakholiyaJenishstr1.split()
Jamylak
@ Jamylak string.split()ist eine Option. Ich habe gefragt, ob es auch mit Regex möglich ist.
Rakholiya Jenish
2
@ RakholiyaJenish Kannst du die re.findallOption nicht verwenden ?
Jamylak
24

Die str.splitMethode entfernt automatisch alle Leerzeichen zwischen Elementen:

>>> str1 = "a    b     c      d"
>>> str1.split()
['a', 'b', 'c', 'd']

Dokumente finden Sie hier: http://docs.python.org/library/stdtypes.html#str.split

Trevor
quelle
1
@ GururajY.S.: Ist str.split()wahrscheinlich die beste Wahl für etwas so Leichtes wie dieses.
Joel Cornett
7

Wenn Sie verwenden re.splitund das geteilte Muster Erfassungsgruppen enthält, bleiben die Gruppen in der Ausgabe erhalten. Wenn Sie dies nicht möchten, verwenden Sie stattdessen eine nicht erfassende Gruppe.

BrenBarn
quelle
2
Verwenden str.splitist wahrscheinlich besser für Ihr Beispiel. Ich wollte nur erklären, warum Sie das Verhalten bekommen, das Sie tun.
BrenBarn
2

Es ist eigentlich sehr einfach. Versuche dies:

str1="a    b     c      d"
splitStr1 = str1.split()
print splitStr1
verdammt
quelle
2
Ich würde dies +1, aber Sie verwenden hässliche Semikolons.
Jamylak
3
@ Jamylak Lol. Ich werde sie ändern. :) Gewohnheit, Java und Python zu benutzen!
Verdammt
1
@ GururajY.S. Wenn Sie nur auf Split auf Basis des Raumes wollen, sollten Sie einfach verwendenstringToSplit.split()
verdammt