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

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

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

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

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

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])

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

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

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

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])

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

...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

Mawe und Helmut,

cool, danke Euch beiden. :)
Antworten