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

re Ausdruck Kommentar Zeilen

Beitragvon feldmaus » Mittwoch 19. November 2008, 03:02

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

Beitragvon Lonestar » Mittwoch 19. November 2008, 08:38

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:

Beitragvon mkesper » Mittwoch 19. November 2008, 08:44

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

Beitragvon Darii » Mittwoch 19. November 2008, 08:52

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

Beitragvon Lonestar » Mittwoch 19. November 2008, 08:52

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

Beitragvon Zap » Mittwoch 19. November 2008, 08: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:

Beitragvon Rebecca » Mittwoch 19. November 2008, 09:21

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

Beitragvon feldmaus » Mittwoch 19. November 2008, 10:42

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

Beitragvon str1442 » Mittwoch 19. November 2008, 10:58

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

Beitragvon BlackJack » Mittwoch 19. November 2008, 11:47

@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

Beitragvon ichbinsisyphos » Mittwoch 19. November 2008, 11:53

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

Beitragvon Lonestar » Mittwoch 19. November 2008, 13:14

@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

Beitragvon Darii » Mittwoch 19. November 2008, 19:42

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:

Beitragvon name » Mittwoch 19. November 2008, 20:08

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

Beitragvon derdon » Mittwoch 19. November 2008, 20:36

@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("#")]

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], pillmuncher