Frage zu re und Stringmanipulationen

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
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hallo

Folgender code

Code: Alles auswählen

befehl = "wodim --devices"
print befehl
process = subprocess.Popen(befehl , shell=True, stdout=subprocess.PIPE)
f = process.stdout.read()
print f
print len(f)
result = re.search ( r"dev='/dev/...'" , f )
print result.group ( 0 )
liefert das zurück
wodim --devices
wodim: Overview of accessible drives (2 found) :
-------------------------------------------------------------------------
0 dev='/dev/hdc' rwrw-- : 'TOSHIBA' 'DVD-ROM SD-M1912'
1 dev='/dev/hdd' rwrw-- : 'HL-DT-ST' 'DVDRAM GSA-4163B'
-------------------------------------------------------------------------
Gibt es eine Möglichkeit nur die 2. + 3. Zeile zu bearbeiten.

Ich möchte am Ende folgendes erhalten
dev='/dev/hdc' DVD-ROM
oder
dev='/dev/hdd' 'DVDRAM

je nach Abfrage

Kann man das per re oder find realisieren.
Mir würde es ausreichen, nur die beiden Zeilen mirt den dev= Einträgen bearbeiten zu können, dann kan ich die mit re.search bearbeiten und mir die groups ausgeben lassen.

mfg
schwedenmann
Zuletzt geändert von schwedenmann am Sonntag 10. Januar 2010, 16:13, insgesamt 1-mal geändert.
mfg
schwedenmann
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Code: Alles auswählen

In [63]: a = """wodim: Overview [...] ------"""
In [64]: for line in a.split('\n'):
   ....:     x = re.findall("'(.+?)'", line)
   ....:     if x: x[0], x[2]
   ....:     
   ....:     
Out[65]: ('/dev/hdc', 'DVD-ROM SD-M1912')
Out[65]: ('/dev/hdd', 'DVDRAM GSA-4163B')
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Code: Alles auswählen

# befehl = "wodim --devices"
# besser:
befehl = ["wodim", "--devices"]
Wobei es schon wundert, dass man nach 24 Postings noch keine Ahnung von Code-Tags hat ;-)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Wenn du die 2. und 3. Zeile deiner Ausgabe haben willst, und diese z.B. im String "s" steht, benutze

Code: Alles auswählen

zweite, dritte = s.splitlines()[2:4]
Da dieses aber die Zeilen "wodim: Overview..." und die erste Zeile mit den "----" wären, glaube ich, dass du irgendwie anders zählst als ich. Wahrscheinlich willst du also die Zeilen zwischen den "----" haben.

Code: Alles auswählen

import re

scan = False
for line in s.splitlines():
    if re.match("-+", line):
        scan = not scan
    elif scan:
        print re.findall(r"dev='([^']*?)'[^']*?'[^']*?' '(\S*)", line)
Stefan
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

`str.splitlines` kannte ich jetzt auch noch nicht oO
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

willst du _wirklich_ nur die 2.+3. Zeile? Das macht das Skript unflexibel, weil es dann ggf. nicht passt, wenn es nur einen bzw. 3+ Treffer gibt.

IMHO solltes es passen, wenn du auf den Ausdruck "Zahl-leer-dev=" matchst.

Gruß, noisefloor
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hallo
willst du _wirklich_ nur die 2.+3. Zeile? Das macht das Skript unflexibel, weil es dann ggf. nicht passt, wenn es nur einen bzw. 3+ Treffer gibt.
Das sollte ausreichen, mehr als 2 DVD/CD-Laufwerke hat doch wohl keiner in einem normalen PC verbaut, oder doch?

Ich möchte das Ganze ev. später in einem kleinen pythonprtogramm zur Erstellung und zum brenne nur von ISO-Dateien unter Linux verwenden.
Die obigen Zeilen, kann ich dann verwenden, um die devices mit wodim automatsich erkennen zu lassen und dann in eine config zu schreiben.

mfg
schwedenmann
mfg
schwedenmann
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

schwedenmann hat geschrieben:Das sollte ausreichen, mehr als 2 DVD/CD-Laufwerke hat doch wohl keiner in einem normalen PC verbaut, oder doch?
Wir werden immer noch von den Einschraenkungen der PC-Pionierzeit heimgesucht, da man damals dachte, dass es fuer alle Zeiten genug ist. Ich waere mit solchen Mutmassungen vorsichtig, v.a. da es relativ einfach ist das auf beliebig viele Zeilen auszudehnen.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

schwedenmann hat geschrieben:Das sollte ausreichen, mehr als 2 DVD/CD-Laufwerke hat doch wohl keiner in einem normalen PC verbaut, oder doch?
Und wenn doch, dann ist dein Programm für denjenigen unnütz :-)
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Das sollte ausreichen, mehr als 2 DVD/CD-Laufwerke hat doch wohl keiner in einem normalen PC verbaut, oder doch?
Eher nicht - aber darum geht es ja gar nicht. :)

Der Kern der Aussage war eher: Warum unnötig unflexibel machen, wenn es mit minimal Mehraufwand auch universell geht?

Oder um es anders auszudrücken:
Dauerbaustelle hat geschrieben: Und wenn doch, dann ist dein Programm für denjenigen unnütz :-)
Gruß, noisefloor
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

schwedenmann hat geschrieben:Das sollte ausreichen, mehr als 2 DVD/CD-Laufwerke hat doch wohl keiner in einem normalen PC verbaut, oder doch?
Wenige, aber auf Windows gibt es Software wie Daemon Tools die ganz viele Laufwerke emulieren kann. Daher würde ich meine Software nicht so einschränken.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
schwedenmann
User
Beiträge: 42
Registriert: Sonntag 21. Oktober 2007, 13:38
Wohnort: Wegberg

Hallo

ich weiß worauf ihr hinaus wollt (universeller, ist egal ob 2 oder meher Zeilen auswerten). dann mach ich das anders, anstatt nur die 2 zeilen mir rauszupicken, nimm ich:
a. die zeile mit DVDRAM für den Brenner mit den deviceangaben am Anfang und
b. die Zeile mit DVD-ROM fürs Leselaufwerk

alle anderen DVD-Laufwerke werden dann ignoriert, da für das Brennen und erzeugen von Iso von DVD-Laufwerk, sowieso nur 2 devices benötigt werden.

@leonidas, das ganze ist nur ne Übung für mich und soll nur unter Linux funktionieren. wodim --devices liest nur die hardwaremäßig verbauten Laufwerke aus, ich könnte auch die dmsg auswerten,

P.S.
Mit welchen Programmen brennen denn nero und Konsorten unter Win? Für cd benutzen enige cdrecord mit cgwin, aber nero?

mfg
schwedenmann
mfg
schwedenmann
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nero ist ein kommerzielles Programm, da ist die Antwort recht einfach: Selbst geschrieben.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

cofi hat geschrieben:Nero ist ein kommerzielles Programm, da ist die Antwort recht einfach: Selbst geschrieben.
Das stimmt, aber die beiden Aussagen sind dennoch nicht korelliert :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Hmm ich weiss nicht, zieht man z.B. in Betracht, wie alt Nero ist, koennte das durchaus der Fall sein.
Ich bin nicht im kommerziellen Umfeld taetig, aber ich koennte mir durchaus vorstellen, dass die an die Kernsoftware Hand anlegen (wollen), insofern waere das ja immernoch richtig, wenn sie die entsprechenden Libs eingekauft haetten oder freie benutzen :roll:
Antworten