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

Code: Alles auswählen

text = re.sub(r'^\s+(?usm)', '', text)

Verfasst: Freitag 24. Februar 2006, 09:57
von Francesco
blackbird hat geschrieben:

Code: Alles auswählen

text = re.sub(r'^\s+(?usm)', '', text)
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:

Code: Alles auswählen

text = re.sub(r'^\s+(?usm)', '', text)
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:

Code: Alles auswählen

text = re.sub(r'\s+$(?m)', '', text)
(?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. :)