RegEx: kriege das letzte Leerzeichen nicht weg

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
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ich komme leider nicht mehr weiter hier, bin aber schon ganz nah dran. Es geht darum, das letzte störende Leerzeichen rauszukriegen:

Code: Alles auswählen

import re
pattern = "\s*(.+)-.*-\s*(.*)\s*(_.*)"
string = " 123 - 456 - 3456.7890_foo.pdf"
regex = re.compile(pattern, re.IGNORECASE)
r = regex.search(string)
print r.groups()
print re.sub(regex, r"\1-\2\3", string)
Ergebnis:

Code: Alles auswählen

('123 ', '3456.7890', '_foo.pdf')
123 -3456.7890_foo.pdf
Das Leerzeichen zwischen "123" und dem Bindestrich soll noch weg.
Kann jemand helfen?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

droptix hat geschrieben:Ich komme leider nicht mehr weiter hier, bin aber schon ganz nah dran. Es geht darum, das letzte störende Leerzeichen rauszukriegen:

Code: Alles auswählen

import re
pattern = "\s*(.+)-.*-\s*(.*)\s*(_.*)"
Was du in der ersten Gruppe brauchst ist nicht irgendetwas beliebiges, sondern alles, was kein Leerzeichen ist. Daraus ergibt sich \S* und das einführende \s* kannst du dir dann schenken. Weiter hinten im Ausdruck hast du noch ein überflüssiges \s*. Das wird bereits durch das .* in der vorhergehenden Gruppe mit abgefrühstückt.

Code: Alles auswählen

pattern = r"(\S*)\s*-.*-\s*(.*)(_.*)"
Wenn du die Gruppen 2 und 3 nicht getrennt brauchst, dann kannst du sie auch zusammenfassen.

Code: Alles auswählen

pattern = r"(\S+).*?(\S*_.*)"
Gegebenenfalls sollte man, je nach erwartetem Ergebnis, einige der *-Quantifizierer noch durch ein + ersetzen.

Eine Ergänzung noch: "string" ist ein äußerst schlecht gewählter Name für einen Bezeichner, da du damit das eingebaute "string" überschreibst.
ntrunk
User
Beiträge: 83
Registriert: Sonntag 7. September 2008, 23:09
Wohnort: Buchen (Odenwald)

Hi zusammen,

falls es nicht ums Prinzip re, sondern ums Ergebnis geht:

Code: Alles auswählen

source = " 123 - 456 - 3456.7890_foo.pdf"
parts = source.strip().split(' - ')
print '-'.join((parts[0],parts[2]))
ist wesentlich schneller (ca. Faktor 12).

Gruß
Norbert
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ergebnis:

Code: Alles auswählen

('123', '3456.7890_foo.pdf')
 123-3456.7890_foo.pdf
D.h. in `groups` steht jetzt wirklich nur '123', aber `re.sub(regex, r"\1-\2", string)` gibt ein führendes Leerzeichen (vor 123) zurück.

@ntrunk: Geht leider nicht, da die Bindestriche mal mit und mal ohne Leerzeichen kommen können und das RegEx benötigt wird, um flexibel zu sein. Es gibt verschiedene Dateinamen, die ich so bereinigen muss. Das WIE steht in einer config.ini Datei (also das RegEx-Pattern und die Replace-Ersetzung).
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

droptix hat geschrieben:in `groups` steht jetzt wirklich nur '123', aber `re.sub(regex, r"\1-\2", string)` gibt ein führendes Leerzeichen (vor 123) zurück.
Ah ja, das habe ich übersehen. Dann gehört doch zusätzlich ein \s* nach ganz vorne.
Antworten