file.replace und reguläre Ausdrücke

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
sroth@stromnot.de
User
Beiträge: 3
Registriert: Montag 2. Februar 2009, 07:58

Hallo,

das hier ist mein erster Berührungspunkt mit Python. Nach langen suchen haben ich eingesehen, das ich das script wohl selbst schreiben muß.

Folgendes soll gemacht werden:

Alle Dateinamen und Ordnernamen eines Verzeichnisbaumes sollen auf Zeichen geprüft werden, die NICHT a-z, A-Z, Unterstrich oder minus sind.
Sind diese Zeichen enthalten, sollen Leerzeichen durch einen Unterstrich ersetzt werden, Umlaute durch 2 Buchstaben und der Rest: weg.

Ich ,möchte das mit regulären Ausdrücken machen, scheitere jedoch an der benutzung dieser. Ich hatte mir das grundlegen so gedacht, geht aber nicht:

Code: Alles auswählen

#!/usr/bin/python

import os, string
import sys
import re

if len(sys.argv)==1:
    filename = os.listdir(os.curdir)
else: 
    filename = sys.argv[1:]
for filename in filename:
    if 'r"\w"' in filename:
        newfilename = filename.replace(r'"(\W)"','x')
        print "Umbennenung von ", filename, "nach ", newfilename, "..."
        os.rename(filename, newfilename)
Auch Kombinationen mit runden Klammern, doppelten Hochkommata etc. funktionieren nicht. Wenn ich ein re. vor die *.replace - Funktion setze gibts Gemecker.

Wie ist der Syntax um in einem solchen Zusammenhang reguläre Ausdrücke zu benutzen und für die Zukunft: wie finde ich alleine so einen Lösung. Sämtliche Onlinelektüre, O'reillys ''Einführung in Python'' etc. haben mit bisher kleinen Erfolg beschert.

Ein Newbie dankt im Voraus.

Gruß
Sven
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Suchst du eventuell ``re.sub``? Bzw, eher eine kompilierte Regex (``re.compile``) die dann ``sub`` als Methode hat.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,

lies die Doku! Da sind genügend Beispiele, an denen du sehen kannst, wie man in Python mit Regexes arbeitet.

Gruß,
Manuel
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

http://docs.python.org/library/re.html

Im übrigen sollte man sich so etwas wie

Code: Alles auswählen

for a in a:
    # mach was mit a
(siehe Zeile 11) nicht angewöhnen.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Wenn du das mit RE machst, brauchst du die in ein str-Objekt eingebaute Methode replace nicht. Die ist nur zur Ersetzung einzelner Substrings da. Wenn du es mit RE machst würde eine Lösung für den RE-Teil etwa so aussehen:

Code: Alles auswählen

import re
test = r'Text bla123. %$" a b c!'

test = re.sub("[^\w\- ]", "", test)  # Sonderzeichen entfernen
test = re.sub(" ", "_", test)  # Leerzeichen ersetzen

print test
gibt folgendes aus:

Code: Alles auswählen

Text_bla123__a_b_c
Ersetz bitte

Code: Alles auswählen

for filename in filename
durch was eleganteres wie z.B.:

Code: Alles auswählen

for filename in dirlist
(zumal dir os.listdir(os.curdir) nicht nur einen filename zurückliefert, sondern eine liste mit evtl. mehreren namen in der auch ordner enthalten sein können)

MFG HerrHagen
sroth@stromnot.de
User
Beiträge: 3
Registriert: Montag 2. Februar 2009, 07:58

Danke HerrHagen!

Helduel:

RTFM ist mir bekannt, da ich aber erst anfange wurde dies nicht verstanden! Das ich re.* gefunden habe, hast Du doch gesehen. Ich stelle keine Fragen, die ich nicht vorher versucht habe mit Doku und man selber zu lösen! Ich hoffe, Du versucht nicht auf die Tour jemandem was beizubringen! Nix für ungut. Vielleicht demnächst etwas freundlicher.

Hagen hat mir geholfen. Wenn ich weitergekommen bin, werde ich Euch den Code mal posten. Dann kannst Du (helduel) ja weiter schimpfen.

Schönen Abend.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,
sroth@stromnot.de hat geschrieben:Danke HerrHagen!

Helduel:

RTFM ist mir bekannt, da ich aber erst anfange wurde dies nicht verstanden! Das ich re.* gefunden habe, hast Du doch gesehen. Ich stelle keine Fragen, die ich nicht vorher versucht habe mit Doku und man selber zu lösen! Ich hoffe, Du versucht nicht auf die Tour jemandem was beizubringen! Nix für ungut. Vielleicht demnächst etwas freundlicher.

Hagen hat mir geholfen. Wenn ich weitergekommen bin, werde ich Euch den Code mal posten. Dann kannst Du (helduel) ja weiter schimpfen.

Schönen Abend.
wo habe ich auch nur annähernd geschumpfen? "RTFM" habe ich nicht geschrieben. Wenn verweise auf die Doku für dich so schlimm sind, dann wirst du hier im Forum wohl noch dein blaues Wunder erleben. ;-) Im übrigen hat numerix auch "geschumpfen": Er hat dich ebenso auf die Doku verwiesen. :roll:

Die Doku hattest du definitiv *nicht* gelesen, auch wenn du behauptest, sämtliche Onlinelektüre, O'reillys ''Einführung in Python'' etc. gelesen zu haben. Wenn du nach Lektüre der Doku lediglich weißt, dass du "import re" tippen musst, dann möchte ich mal wissen, was für eine Doku du gelesen hast. Bereits das erste Code-Beispiel zeigt, wie man mit Regexes in einem String sucht. Wenn's dann nicht weiter geht (weil du die sub-Methode nicht gefunden hast; weil der Ausruck nicht stimmt), ist wohl jeder gern bereit, dir mehr zu helfen. Andernfalls muss man einfach auf die Doku verweisen, weil die meistens sehr gut ist und selbst erarbeitetes Wissen besser hängen bleibt.

Gruß,
Manuel
sroth@stromnot.de
User
Beiträge: 3
Registriert: Montag 2. Februar 2009, 07:58

Laßt uns nicht streiten, sondern produktiv arbeiten.
Habe ich behauptet, ich hätte alles gelesen? Kann ich mich garnicht dran erinnern ;-)). Ich habe nur gesagt, ich habe nichts passendes gefunden (wahrscheinlicher ist jedoch, ich habe das gefundene nicht richtig verstanden!!)

Wenn ich nicht verstehe, was ich lese, macht das weiterlesen keinen Sinn! Ich versuche einen Einstieg zu finden und habe um Hilfe gebeten. Die hast Du mir angebote. Danke dafür. ich werde (muß) bestimmt darauf zurück kommen.

Newbies sind eben manchmal ausgesprochen frustriert und reagieren etwas mimosenhaft.
Also ich reiße mich auch am Riemen (autsch) und gebe mir nochmal so viel Mühe wie bisher!!!

Gruß
Sven
"Perfektion ist nicht dann erreicht,
wenn es nichts mehr hinzu zu fügen gibt,
sondern wenn man nichts mehr weglassen kann."
--> Antoine de Saint-Exupéry
Antworten