Seite 1 von 1

Frage zu re und Stringmanipulationen

Verfasst: Samstag 9. Januar 2010, 20:02
von schwedenmann
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

Verfasst: Samstag 9. Januar 2010, 21:43
von Dauerbaustelle

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

Re: Frage zu re und Stringmanipulationen

Verfasst: Sonntag 10. Januar 2010, 05:54
von Hyperion

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

Verfasst: Sonntag 10. Januar 2010, 12:12
von sma
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

Verfasst: Sonntag 10. Januar 2010, 15:09
von Dauerbaustelle
`str.splitlines` kannte ich jetzt auch noch nicht oO

Verfasst: Montag 11. Januar 2010, 12:15
von noisefloor
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

re

Verfasst: Mittwoch 13. Januar 2010, 14:18
von schwedenmann
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

Re: re

Verfasst: Mittwoch 13. Januar 2010, 14:26
von cofi
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.

Re: re

Verfasst: Mittwoch 13. Januar 2010, 14:42
von Dauerbaustelle
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 :-)

Verfasst: Mittwoch 13. Januar 2010, 15:19
von noisefloor
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

Re: re

Verfasst: Mittwoch 13. Januar 2010, 15:23
von Leonidas
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.

DVD-Laufwerke

Verfasst: Mittwoch 13. Januar 2010, 17:40
von schwedenmann
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

Verfasst: Mittwoch 13. Januar 2010, 17:58
von cofi
Nero ist ein kommerzielles Programm, da ist die Antwort recht einfach: Selbst geschrieben.

Verfasst: Mittwoch 13. Januar 2010, 23:24
von Leonidas
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 :)

Verfasst: Donnerstag 14. Januar 2010, 00:04
von cofi
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: