re Ausdruck Kommentar Zeilen

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.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Hi Leute,

ich teste schon seit ein paar Stunden mein Script und
komme nicht weiter. Dieses Dcript liest eine Text Datei
ein und zwar nur den Nicht-Kommentar text.

Laut Doku sollte dies alle nicht-Kommenatr Zeilen
zu dem Objekt Regulärer Ausdruch hinzufügen:

Code: Alles auswählen

re = compile('(?#...)')
self.Liste = re.findall(self.Text)
Die Text Datei sieht so aus:
  • ### LISTE BEGIN
    /etc/fstab
    /boot/grub/menu.lst
    /etc/mdadm/mdadm.conf
    /etc/dhcp3/dhcpd.conf
    /etc/bind/named.conf
    /etc/bind/named.conf.options
    /etc/bind/named.conf.local
    /etc/bind/db.feldland.lan
    /etc/bind/db.0.168.192
    /etc/network/interfaces
    /etc/hosts
    /etc/host.conf
    /etc/udev/eigene1.rules
    # LINK /etc/udev/rules.d/010_eigene1.rules /etc/udev/eigene1.rules
    /etc/samba/smb.conf
    /etc/exports
    /etc/ppp/peers/dslprovider
    /etc/group
    /etc/passwd
    /etc/modules
    /etc/timezone
    /etc/hostname
    /root/bin/firewall
    /root/bin/handle_mdadm_events
    /root/bin/modload
    /root/bin/pcdown
    /etc/crontab
    /etc/environment
    /etc/hdparm.conf
    /etc/inputrc
    /etc/cups/cupsd.conf
    /etc/cups/printers.conf
    ### LISTE END
Irgendwie macht der aber nicht das was ich wollte.
Kann mir da Jemand helfen bitte?
Kommentar Zeilen beginnen mit einem '#'.

Grüße Markus
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

warum brauchst du denn überhaupt reguläre Ausdrücke? Das geht doch viel einfacher wenn du beim Einlesen jeder Zeile kurz überprüfst ob sie ein Kommentar ist oder nicht:

Code: Alles auswählen

text = []
file = open(filename, r)
while True:
    line = file.readline()
    if not "#" in line:
        text.append(line)
wenn die Zeile also kein Kommentar entählt kannst du sie an deinen Text anhängen, und sonst liest du fleissig weiter ein. Jut , eine Zeile die eine Raute irgendwo in der Mitte enhält ist auch eine auskommentierte Zeile, aber das spielt in deinem Beispiel ja keine Rolle.
Ach ja, bei Dateiende muss die Endlosschleife noch beendet werden, ich weiss gerade nich mehr wie ich das beim letzen Mal gemacht habe, aber das soll ja wohl nich dein Problem sein :wink:
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Code: Alles auswählen

text = []
file = open(filename, r)
while True:
    line = file.readline()
    if not line.startswith("#"):
        text.append(line)
Da es so einfach ist, es richtig zu machen, sollte man es ruhig auch tun. ;)
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Da hast du die Doku falsch verstanden. Das ist ein Kommentar im regulären Ausdruck selbst.
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

dann ist es nur dumm wenn jemand in so einer Datei per Hand etwas auskommentiert, sich überlegt es übesichtlicher zu gestalten, und anfängt auskommentierte Zeilen einzurücken... das hab ich alles schon gesehen - da ein '#' im Beispiel nicht mitten in einer gültigen Zeile vorkommt fand ich die andere Variante passender.
Allerdings ist es bei dir immer noch nicht lauffähig ... wenn du schon verbesserst, und meinst es wäre danch richtig - dann doch bitte richtig
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Selbst wenn man es erlaubt das ein Kommentar hinter einer Codezeile steht, ist das einfach ohne re zu lösen:

Code: Alles auswählen

text= []
for line in open(filename):
    c_start = line.find("#")
    if c_start != -1:
        text.append(line[c_start:])
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Fuer eingerueckte Kommentarzeilen geht's auch so:

Code: Alles auswählen

line.strip().startswith("#")
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Darii hat geschrieben:Da hast du die Doku falsch verstanden. Das ist ein Kommentar im regulären Ausdruck selbst.
Ich frage nochmal nach, ob ich das eben richtig gelesen habe.
Das soll für Kommentare im Regulären Ausdruck sein?
Seit wann kommentiert Jemand was im regulären Ausdruck?
In der Doku steht nämlich nur,
  • (?#...)
    A comment; the contents of the parentheses are simply ignored.
Wie soll man da als Anfänger wissen was gemeint ist.
Bitte an die Doku Leute, deutlicher nachtragen.

Grüße Markus
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Ja, das ist ein Kommentar im Regex. Man benutzt re's nicht nur intern in diversen Sprachen, sondern auch eher universell auf unixoiden Systemen, und man kann auch ganze Skripte schreiben. Die Beschreibung ist ausreichend. Würde es nicht um Kommentare im Regex gehen würde das doch gar nicht erwähnt werden.
BlackJack

@Lonestar: Du hast da eine nette Endlosschleife gebastelt. Warum überhaupt ``while``? Man kann mit ``for`` direkt über das Dateiobjekt iterieren.
ichbinsisyphos
User
Beiträge: 120
Registriert: Montag 4. Juni 2007, 19:19

feldmann_markus hat geschrieben:
Darii hat geschrieben:Da hast du die Doku falsch verstanden. Das ist ein Kommentar im regulären Ausdruck selbst.
Ich frage nochmal nach, ob ich das eben richtig gelesen habe.
Das soll für Kommentare im Regulären Ausdruck sein?
Seit wann kommentiert Jemand was im regulären Ausdruck?
In der Doku steht nämlich nur,
  • (?#...)
    A comment; the contents of the parentheses are simply ignored.
Wie soll man da als Anfänger wissen was gemeint ist.
Bitte an die Doku Leute, deutlicher nachtragen.

Grüße Markus
Das kann nur ein Kommentar im regulären Ausdruck sein, die einzelnen Programmiersprachen und Interpreter definieren Kommentare unterschiedlich. Bei bash und python mit "#", bei C mit "//" oder "/* kommentartext */", und vieles mehr.

Die Aufforderung "Hey regex, hol mir aus dem file die Kommentare raus" ist nicht eindeutig :-D.

Ich hab den re-Modul-syntax nicht im Kopf, aber wenns regex sein muss, dann such nach dem Zeichen "#" und allem was bis zum nächsten Newline folgt.
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

@BlackJack
ja, das die Schleife nie aufhört hatte ich ja schon dabeigeschrieben - das kommt davon wenn man nicht an seinem eigenem Rechner sitzt, und gerade bei ner Tasse Kaffee wach werden möchte (Notiz an mich selber: erst nach der 1. Tasse Kaffee auf solche Fragen Antworten). Das mit dem iterieren über for brauchte erst noch eine Tasse, aber da war ich schon wieder mit was anderem beschäftigt... aber es wurde ja auch ohne mich fleissig weiter geholfen :wink:
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

feldmann_markus hat geschrieben:In der Doku steht nämlich nur,
  • (?#...)
    A comment; the contents of the parentheses are simply ignored.
Wie soll man da als Anfänger wissen was gemeint ist.
Bitte an die Doku Leute, deutlicher nachtragen.
„Ein Kommentar, der Inhalt der Klammer wird ignoriert.“ Eigentlich recht eindeutig finde ich.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

Code: Alles auswählen

[x for x in open('filename') if not x.startswith("#")]
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

@name: machs doch so, wie rebecca das vorgeschlgen hat. Also:

Code: Alles auswählen

[x for x in open('filename') if not x.strip().startswith("#")]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

name hat geschrieben:

Code: Alles auswählen

[x for x in open('filename') if not x.startswith("#")]
Die Datei wird nicht geschlossen und du verlässt sich darauf, dass vor einem "#" nicht mal ein Leerzeichen oder Tab o.ä. steht. Siehe dazu Posting von Rebecca.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Ich will auch mal ;)

Code: Alles auswählen

with open('filename') as f:
    [line for line in f if not line.strip().startswith('#')]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

DasIch hat geschrieben:Ich will auch mal ;)

Code: Alles auswählen

with open('filename') as f:
    [line for line in f if not line.strip().startswith('#')]
Da hast du ja schnell und heimlich nochmal nachgebessert .... :wink:
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

numerix hat geschrieben:
name hat geschrieben:

Code: Alles auswählen

[x for x in open('filename') if not x.startswith("#")]
Die Datei wird nicht geschlossen und du verlässt sich darauf, dass vor einem "#" nicht mal ein Leerzeichen oder Tab o.ä. steht. Siehe dazu Posting von Rebecca.
Sollte eigentlich nur der Hinweis darauf sein das man LC nutzen sollte.
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

name hat geschrieben:Sollte eigentlich nur der Hinweis darauf sein das man LC nutzen sollte.
Sobald man aber Kommentare am Ende einer Zeile raushaben will wirds schwierig mit der LC.
Antworten