regular expression für splitting

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 27. März 2008, 17:22

Hoi,

mal eine regex Frage von mir:

Ich möchte u. a. einen String splitten. Und zwar aufgrund von Whitespace, Minuszeichen und Integern, die einzelnen Großbuchstaben folgen. Und zwar so, daß die Trennzeichen erhalten bleiben. Meine bisherige Lösung ist etwa:

Code: Alles auswählen

splits = re.compile('([\s-])+')
for line in fileobject:
    splits.split(line)
Ok, aber wie erfülle ich die letzte Bedingung? Kann mir jemand einen Tipp geben - ich stehe völlig auf dem Schlauch. Wichtig ist, daß wirklich nur Integern, die einzelnen Großbuchstaben folgen zusätzlich verwendet werden. Keine Ketten wie 'ABX1'.

Danke,
Christian
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Donnerstag 27. März 2008, 17:41

Moin,

ich weiß nicht, ob ich das genau verstanden habe, aber vielleicht hilft dir ja folgendes weiter:

Code: Alles auswählen

splits = re.compile('((?:[\s-])+|(?:\W\w\d)+)')
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Donnerstag 27. März 2008, 17:43

helduel hat geschrieben:Moin,

ich weiß nicht, ob ich das genau verstanden habe, aber vielleicht hilft dir ja folgendes weiter:

Code: Alles auswählen

splits = re.compile('((?:[\s-])+|(?:\W\w\d)+)')
Jetzt merk ich grad selbst, dass das mit den '\w's Blödsinn ist, aber wenn man die mit [A-Z], und \W mit [^A-Z] erzetzt, sollte es zumindest richtiger sein. :D
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 27. März 2008, 18:03

Vielen, vielen Dank - das ist schon mal die halbe Miete. (Ich bin bei dem ?: hängengeblieben - keine Übung mehr mit den Dingern ...)

Jetzt wird 'AA1000' nicht geteilt - gut.
Aber 'A1000' wird auch nicht geteilt - schlecht.

Dennoch lasse ich das jetzt besser so. Den letzten Teil kann ich auch per Hand machen - das ist einfacher, als die hinterher entstandene Liste kompliziert aufzuräumen.

Gruß,
Christian
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Donnerstag 27. März 2008, 18:05

CM hat geschrieben:Jetzt wird 'AA1000' nicht geteilt - gut.
Aber 'A1000' wird auch nicht geteilt - schlecht.
Einfach hinter das \d ein + hängen, dann sollte auch das klappen.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 27. März 2008, 18:13

Nein, tut es nicht - warum auch? Aber das ist eigentlich unproblematisch.

(Problematisch ist, daß ich so versuche einen miserablen Parser für ein miserables
Dateiformat auszutricksen. ;-) )
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Donnerstag 27. März 2008, 18:23

CM hat geschrieben:Nein, tut es nicht - warum auch?
Weil ich falsch gelesen hab. :lol: Ich seh schon: Ich geh Feierabend...
BlackJack

Freitag 28. März 2008, 07:57

@CM: Geht es dabei im Daten in einem der 'REMARK'-Blöcke? Denn das "Hauptformat" scheint ja in festen Spalten organisiert zu sein, dass würde ich nicht mit REs splitten.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Freitag 28. März 2008, 08:24

Nein. Das Problem ist, daß ich auf kein alternatives Format ausweichen kann (die es gibt), aber mein Molekül so groß ist (hunderttausende Atome pro Kette, wenn auch nur nominell), daß die Spalten verrutschen und "aneinanderkleben". Habe ich die Objekte einmal korrekt im Speicher ist alles weitere einfach. REs schlicht weil zuviele "exotische" Einträge in den Files stehen.

Inzwischen betrachte ich diesen Teil des Problem aber als gelöst. Vielleicht brauche ich mehr Code als Du brauchen würdest, es gibt aber eine für mich übersichtliche Lösung ;-).

Vielen Dank
Christian
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Dienstag 1. April 2008, 13:23

CM hat geschrieben:Inzwischen betrachte ich diesen Teil des Problem aber als gelöst. Vielleicht brauche ich mehr Code als Du brauchen würdest, es gibt aber eine für mich übersichtliche Lösung ;-).

Vielen Dank
Christian
Nur interessehalber: Würde diese Regex Dir das richtige Ergebnis liefern?

Code: Alles auswählen

((?:[\s-])+|(?<![A-Z])(?:[A-Z]\d+))
MfG
HWK
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Mittwoch 9. April 2008, 21:36

Sorry, war die letzten Tage ziemlich ausgeknockt und werde auch bis in die nächste Woche hinein keine Zeit haben, mich darum zu kümmern.

Dennoch vielen Dank - ich komme drauf zurück.

Gruß,
Christian
Antworten