2016-11-28 1 views
2

Ich lerne Python (3). Ich möchte jede dieser Zeilen in vier separate Teile aufteilen.Wie könnte ich diese Zeichenfolge in Python teilen

[Test Branch]    bobjones  0   6/13/2008 4:24 PM 
[Todd's Workspace]  tfatcher  0   6/16/2008 9:20 AM 
[Henry]     hmckinkley  1   6/17/2008 10:12 AM 
[Henry]     hmckinkley  0   6/17/2008 10:15 AM 

Ich könnte line.split() auf jedem einzelnen nennen, aber dann würde ich das Datum wieder zusammensetzen. Und ich denke, die Leerzeichen im ersten [] Abschnitt regeln das auch. Ich nehme an, ich könnte es schneiden, aber ich bin nicht 100% sicher, dass diese Daten so fest sind, wie es scheint. Eine Regex ist wahrscheinlich am besten, oder? Irgendwelche Hinweise darauf?

Update: Ich dachte @ Selcuk Lösung dieses großen funktionieren würde:

branch,user,version,timestamp = [commitheaderline.split("]", 1)[0] + "]"] + commitheaderline.split("]", 1)[1].split(None, 2) 

Aber dann traf ich einige Daten, wo der Benutzername zu lang war (Beispiel unten), so dass der Rest der Daten beendet auf einer neuen Linie. Daran arbeite ich jetzt. Ich denke, ich teste die Zeile irgendwie vor dem Ausführen der Split(), und wenn es nicht wie eine "richtige" Linie aussieht, werde ich es mit der nächsten verbinden.

[Test Branch]    bobjones  0   6/13/2008 4:24 PM 
[Todd's Workspace]  tfatcher  0   6/16/2008 9:20 AM 
[cole]     bob.darknsdale 
             0  7/27/2012 12:49 PM 
+0

Alles, was Sie selbst versucht haben? –

+0

Kurz: 'line.split (None, 4)'. – TigerhawkT3

+4

@ TigerhawkT3 Dies wird auch spalten '" [Test "und" "Branch]" – Selcuk

Antwort

0

Sie könnten wie folgt vorgehen:

[line.split("]", 1)[0] + "]"] + line.split("]", 1)[1].split(None, 2) 

die in

['[Test Branch]', 'bobjones', '0', '6/13/2008 4:24 PM'] 
+0

Ich bekomme einen Index außerhalb des Bereichsfehler 'commitdetails = [part.split ("] ", 1) [0] +"] "] + part.split ("] ", 1) [1] .split (Keine , 2) '. Wahrscheinlich, weil ich einige andere Datenzeilen habe, die auch durch diese laufen (ich ignoriere sie für den Moment) –

+0

Ja, es funktioniert, wenn ich die überflüssigen Linien ausstrippe. –

+0

Ich endete mit Ihrer Lösung, danke. –

2

führen Versuchen

import re 
sep = re.split(" {2,}", str) 

Das funktioniert, wenn die Saiten durch mehr getrennt sind als ein Leerzeichen. Wenn sie Registerkarte sind versuchen abgegrenzte

import re 
sep = re.split("\t+", str) 
+0

Dies wird fehlschlagen, wenn nur ein Leerzeichen zwischen @ TigerhawkT3 kommentiert wird und wenn mehrere Spalten in einem Spaltenwert stehen. – Selcuk

+0

Vielleicht sollte das OP auf die Besonderheiten eingehen, mit denen er/sie arbeitet. Es funktioniert für die angegebenen Beispiele. – sakurashinken

+1

könnte das Leerzeichen durch '\ s',' re ersetzen.split ("\ s {2,}", str) ', dann behandelt es beide Leerzeichen/Tab – Skycc

0
In [4]: import re 

In [5]: print text 

[Test Branch]    bobjones  0   6/13/2008 4:24 PM 
[Todd's Workspace]  tfatcher  0   6/16/2008 9:20 AM 
[Henry]     hmckinkley  1   6/17/2008 10:12 AM 
[Henry]     hmckinkley  0   6/17/2008 10:15 AM 


In [6]: pattern = re.compile(r'(\[.*?\])\s+(\w+)\s+(\d+)\s+(.*?$)', re.M) 


In [7]: for match in pattern.finditer(text): 
    ...:  #do whatever you want here. cols are grouped 
    ...:  print "first col: %s - 4th col: %s" %(match.group(1), match.group(4)) 
    ...: 
    ...: 
first col: [Test Branch] - 4th col: 6/13/2008 4:24 PM 
first col: [Todd's Workspace] - 4th col: 6/16/2008 9:20 AM 
first col: [Henry] - 4th col: 6/17/2008 10:12 AM 
first col: [Henry] - 4th col: 6/17/2008 10:15 AM 

Dies wird mit jeder Größe von Leerzeichen oder Tabs zu arbeiten.

Verwandte Themen