Seite 1 von 1
regex für "Remove Trailing Whitespace" gesucht
Verfasst: Freitag 24. Februar 2006, 09:41
von Francesco
Hi!,
Nachdem ich in comp.lang.python gefragt habe, und immer noch
keine Lösunge für mein Problem habe, wende ich mich an Euch.
Selber bin ich auch nicht allzu versiert mit RE.
Problem: Suche
einen Ausdruck, der sowohl Dos (Windows)
CRLF und Unix LF die überstehenden Leerzeichen
und auch tabs entfernt.
Leider habe ich mit folgendem keinen Erfolg (arbeitet nur für Unix):
>>> import re
>>> retrailingwhitespace = re.compile('(?<=\S)[ \t]+$', re.MULTILINE)
1) Windows
>>> r="erewr \r\nafjdskl "
>>> newtext, n = retrailingwhitespace.subn('', r)
>>> n
1
>>> newtext
'erewr \r\nafjdskl'
2) Unix
>>> r="erewr \nafjdskl "
>>> newtext, n = retrailingwhitespace.subn('', r)
>>> n
2
>>> newtext
'erewr\nafjdskl'
>>>
Danke schonmal (bin mir sicher, ihr wisst da was.

).
Verfasst: Freitag 24. Februar 2006, 09:45
von mitsuhiko
Verfasst: Freitag 24. Februar 2006, 09:57
von Francesco
blackbird hat geschrieben:
Hallo,
verstehe ich nicht ganz (Der Ausdruck macht auch nichts):
Code: Alles auswählen
>>> r="erewr \nafjdskl "
>>> re.sub(r'^\s+(?usm)', '', r)
'erewr \nafjdskl '
Was ist das (?usm)?
Verfasst: Freitag 24. Februar 2006, 11:11
von helmut
Hallo,
versuch es mal hiermit:
Code: Alles auswählen
t='alle meine Entchen \t\t'
regex = re.compile('\s*$')
regex.sub("",t)
print t #'alle meine Entchen'
Gruss, Helmut
Verfasst: Freitag 24. Februar 2006, 12:28
von Francesco
helmut hat geschrieben:Hallo,
versuch es mal hiermit:
Code: Alles auswählen
t='alle meine Entchen \t\t'
regex = re.compile('\s*$')
regex.sub("",t)
print t #'alle meine Entchen'
Gruss, Helmut
Danke, berücksichtigt leider keine Lineendings.
Ich glaube, ich habe eine Lösung gefunden.
Zwar nicht schön, aber doch einfach genug.
Gegeben: Alle Lineendings in einem File sind gleich (also nicht gemischt).
swin="erewr \r\nafjdskl "
sunix="erewr \nafjdskl "
Werte einmal aus, welche Art von Lineendings das ist.
(Suche nach mindestens einem '\r')
r ist der Inhalt von File
Code: Alles auswählen
helpchar = ''
if r.find('\r') != -1:
helpchar = '\r'
retrailingwhitespacelf = re.compile('(?<=\S)[ \t'+helpchar+']+$', re.MULTILINE)
newtext, n = retrailingwhitespace.subn(helpchar, r)
if n > 0:
r = newtext
Verfasst: Freitag 24. Februar 2006, 13:15
von mawe
Hi!
Was ist damit?
Code: Alles auswählen
In [13]: r = "erewr \t \r\nafjdskl "
In [14]: re.sub(r'\s*(\n|$)', '\n', r)
Out[14]: 'erewr\nafjdskl\n'
EDIT: Das is vielleicht besser:
Code: Alles auswählen
In [18]: re.sub(r'\s*(\n|$)', r'\1', r)
Out[18]: 'erewr\nafjdskl'
Gruß, mawe
Verfasst: Freitag 24. Februar 2006, 14:21
von mitsuhiko
Francesco hat geschrieben:blackbird hat geschrieben:
Hallo,
verstehe ich nicht ganz (Der Ausdruck macht auch nichts):
Code: Alles auswählen
>>> r="erewr \nafjdskl "
>>> re.sub(r'^\s+(?usm)', '', r)
'erewr \nafjdskl '
Was ist das (?usm)?
Sorry. Der war für leading whitespaces. Hier für ending:
(?usm) = unicode, dotall, multiline
Hier hätte (?m) gereicht, aber ich hatte das jetzt einfach noch so im Kopf, wiel es das standard Pattern ist, das ich hinten anhänge

Verfasst: Freitag 24. Februar 2006, 17:56
von Francesco
Danke Euch beiden; ist es aber auch nicht ganz.
Code: Alles auswählen
>>> swin="erewr \r\nafjdskl "
>>> re.sub(r'\s*(\n|$)', r'\1', swin)
'erewr\nafjdskl'
>>> re.sub(r'\s+$(?m)', '', swin)
'erewr\nafjdskl'
in beiden Fällen verschwindet das '\r'.
Verfasst: Freitag 24. Februar 2006, 18:54
von mitsuhiko
Francesco hat geschrieben:Danke Euch beiden; ist es aber auch nicht ganz.
Code: Alles auswählen
>>> swin="erewr \r\nafjdskl "
>>> re.sub(r'\s*(\n|$)', r'\1', swin)
'erewr\nafjdskl'
>>> re.sub(r'\s+$(?m)', '', swin)
'erewr\nafjdskl'
in beiden Fällen verschwindet das '\r'.
Irgendwie logisch oder? \r ist ein newline char.
Verfasst: Freitag 24. Februar 2006, 18:58
von mawe
Noch ein Versuch: Zwar keine Regex, scheint aber das zu tun was Du willst:
Code: Alles auswählen
In [62]: s = "lala \t\r\ngaga\t \t"
In [63]: "".join([i.strip("\t ") for i in s.split(" ")])
Out[63]: 'lala\r\ngaga'
In [64]: s = "lala \t\ngaga\t \t"
In [65]: "".join([i.strip("\t ") for i in s.split(" ")])
Out[65]: 'lala\ngaga'
Verfasst: Freitag 24. Februar 2006, 19:46
von helmut
...und noch einer:
Code: Alles auswählen
regex = re.compile('\s*$',re.M)
s = "lala \t\r\ngaga\t \t"
regex.sub("",s,re.M)
# 'lala\ngaga'
s = "lala \t\ngaga\t \t"
regex.sub("",s,re.M)
# 'lala\ngaga'
s='hier und heute \t\t\n da und dort\t \r\nwo und warum \n\r'
regex.sub("",s,re.M)
# 'hier und heute\n da und dort\nwo und warum'
Gruss, Helmut
Verfasst: Samstag 25. Februar 2006, 09:45
von Francesco
Mawe und Helmut,
cool, danke Euch beiden.
