Seite 1 von 1
RegEx: kriege das letzte Leerzeichen nicht weg
Verfasst: Dienstag 25. Januar 2011, 08:24
von droptix
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?
Re: RegEx: kriege das letzte Leerzeichen nicht weg
Verfasst: Dienstag 25. Januar 2011, 08:45
von /me
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:
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.
Wenn du die Gruppen 2 und 3 nicht getrennt brauchst, dann kannst du sie auch zusammenfassen.
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.
Re: RegEx: kriege das letzte Leerzeichen nicht weg
Verfasst: Dienstag 25. Januar 2011, 09:43
von ntrunk
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
Re: RegEx: kriege das letzte Leerzeichen nicht weg
Verfasst: Dienstag 25. Januar 2011, 09:50
von droptix
Ergebnis:
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).
Re: RegEx: kriege das letzte Leerzeichen nicht weg
Verfasst: Dienstag 25. Januar 2011, 11:11
von /me
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.