regex für "Remove Trailing Whitespace" gesucht

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.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

regex für "Remove Trailing Whitespace" gesucht

Beitragvon Francesco » Freitag 24. Februar 2006, 09:41

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. :) ).
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Freitag 24. Februar 2006, 09:45

Code: Alles auswählen

text = re.sub(r'^\s+(?usm)', '', text)
TUFKAB – the user formerly known as blackbird
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Beitragvon Francesco » Freitag 24. Februar 2006, 09:57

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)?
helmut
User
Beiträge: 57
Registriert: Mittwoch 2. November 2005, 07:45
Wohnort: Dormagen

Beitragvon helmut » Freitag 24. Februar 2006, 11:11

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
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Beitragvon Francesco » Freitag 24. Februar 2006, 12:28

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Freitag 24. Februar 2006, 13:15

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
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Freitag 24. Februar 2006, 14:21

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 :)
TUFKAB – the user formerly known as blackbird
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Beitragvon Francesco » Freitag 24. Februar 2006, 17:56

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'.
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Freitag 24. Februar 2006, 18:54

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.
TUFKAB – the user formerly known as blackbird
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Freitag 24. Februar 2006, 18:58

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'
helmut
User
Beiträge: 57
Registriert: Mittwoch 2. November 2005, 07:45
Wohnort: Dormagen

Beitragvon helmut » Freitag 24. Februar 2006, 19:46

...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
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Beitragvon Francesco » Samstag 25. Februar 2006, 09:45

Mawe und Helmut,

cool, danke Euch beiden. :)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder