Python und Regex

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
gianna
User
Beiträge: 4
Registriert: Samstag 7. November 2009, 23:22

Hallo,

ich versuche mich gerade ein kleines Programm zu schreiben, das eine .sam Datei einliest und diese auswertet. Aufgebaut ist diese Datei wie folgt: Sie besteht aus 10 Teilen, die jeweils mit einem Tab oder einem Leerzeichen getrennt sind. Die einzelnen Teile können aus Zahlen, Buchstaben und Sonderzeichen bestehen.
Ich muss die Teile 1, 4 und 10 auslesen und versuche dafür mit Regex zu arbeiten. Die Datei lese ich zeilenweise ein und bin auch schon soweit gekommen die Tabs durch andere Zeichen zu ersetzen, nur um zu schauen, ob er die richtige Stelle findet. Dann habe ich mit dem Pattern lookbehind gearbeitet (?=\t), der Fehler liegt nicht bei dem \t denn, wenn ich die Tabs ersetzt habe und dafür z.b. nach (?= !!!) suche, findet er auch die Stelle, jedoch kann ich nicht vernünftig draufzugreifen.
Zum Beispiel sieht meine Zeile so aus: 32434sdfsd233_ 34324sd2w3q, dann möchte ich, dass er mir die erste Zeichenfolge ausgibt, wenn ich jedoch nach dem Pattern ".*(?=\t)" suche, gibt er mir wieder die ganze zeile aus. Habe mit search, match, finditer, findall und dann jeweils mit den Listen oder match.group() gearbeitet. Aber nie das erwünschte Ergebnis erhalten, hat jemand eine Idee?
Wäre euch sehr dankbar.
Liebe Grüße,
Gianna
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Naja, wenn du nur Tabs und Leerzeichen als Trenner hast, dann brauchst du keine Regular Expressions:

Code: Alles auswählen

In [1]: s = """Spalte1 Spalte2 Spalte3
S1 S2\tS3
S1\tS2 S3"""

In [2]: [line.split(' ') for line in s.replace('\t', ' ').split('\n')]
Out[2]: [
          ['Spalte1', 'Spalte2', 'Spalte3'],
          ['S1', 'S2', 'S3'],
          ['S1', 'S2', 'S3']
        ]
Gruß
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Je nach dem genauen Format evtl. auch nur

Code: Alles auswählen

line.split()
ohne vorher die Tabs zu ersetzen.
MfG
HWK
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Wenn man an Leerzeichen ODER TAB trennen will, sollte doch `re.split("[ \t]", s)` reichen. Das liefert eine Liste aus der man sich den passenden Teil greift. Wenn es Leerzeichen UND TAB ist, reicht sogar das normale `str.split`. Das `".*(?=\t)"` nicht funktioniert, liegt daran, dass `*` greedy ist, also nicht den ersten, kürzesten Treffer nimmt, sondern den letzten, längsten. Benutze `".*?(?=\t)"`.

Stefan
Antworten