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.


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']

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


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.


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

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
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.