Hallo Leute,
ich stehe ein wenig auf dem Schlauch. Ich muss aus mehreren Templatedateien und einer Konfigurationsdatei unterschiedliche Zieldateien erzeugen. Der Aufbau einer Zeile innerhalb des Templates ist in etwa so:
nfsroot=@@STAGE:stage-p@VAR:nfsroot@@ serverip=10.221.1.99 ARGS=soft,nosync @@STAGE:stage-p@VAR:config@@
Im Ziel müsste die Zeile dann so aussehen:
nfsroot=nfsroot-p-20100407-001 serverip=10.221.1.99 ARGS=soft,nosync configspace-p-20100403-002
Die Konfigurationsdatei sieht da wie folgt aus:
[stage-p]
nfsroot=nfsroot-p-20100407-001
config=configspace-p-20100403-002
[stage-t]
nfsroot=nfsroot-p-20100406-001
config=configspace-p-20100403-002
Ich denke, dass das irgendwie mit re gemacht werden kann / muss. Nur leider stehe ich vollkommen auf dem Schlauch. Kann wer helfen?
Dateien aus Template und Variablen generieren
Na und, ich nicht.timetrinus hat geschrieben:Ich muss aus mehreren Templatedateien und einer Konfigurationsdatei unterschiedliche Zieldateien erzeugen.
Sagt mir gar nichts.nfsroot=@@STAGE:stage-p@VAR:nfsroot@@ serverip=10.221.1.99 ARGS=soft,nosync @@STAGE:stage-p@VAR:config@@
Könnte schon, hab' aber keine Lust.Kann wer helfen?
@timetrinus: Das `re`-Modul und das `ConfigParser`-Modul solltest Du Dir mal anschauen.
Oder wo war jetzt die konkrete Frage?
Oder wo war jetzt die konkrete Frage?
Statt `ConfigParser`lieber `configobj` ( http://www.voidspace.org.uk/python/configobj.html )BlackJack hat geschrieben:@timetrinus: Das `re`-Modul und das `ConfigParser`-Modul solltest Du Dir mal anschauen.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher
http://ms4py.org/
Gerhard Kocher
http://ms4py.org/
-
- User
- Beiträge: 2
- Registriert: Mittwoch 7. April 2010, 20:46
Ja, das `re`-Modul hatte ich schon befürchtet. Mit re.findall finde ich ja auch die betreffenden Zeilen. Aber ich müsste das ja wie folgt machen:BlackJack hat geschrieben:@timetrinus: Das `re`-Modul und das `ConfigParser`-Modul solltest Du Dir mal anschauen.
Oder wo war jetzt die konkrete Frage?
1. suche nach @@[0-9a-zA-Z-]*@[0-9a-zA-Z-]*@@
2. Zerlege den gefundenen Teilstring: stage=value1, var=value2
3. Ermittle für stage den Wert von var aus der Konfig
4. ersetze das gesamte Konstrukt @@[0-9a-zA-Z-]*@[0-9a-zA-Z-]*@@ durch den ermittelten Wert für var
Soweit die therorie. Ich bekomme es aber in der Praxis nicht hin und bin für Hilfe dankbar.
-
- User
- Beiträge: 108
- Registriert: Sonntag 7. Februar 2010, 14:16
Reichen re.findall, re.split, re.sub und die restlichen Hinweise in der re-Hilfe nicht aus?
Poste mal deinen aktuellen Code, dann kann man korrigieren wenn du was falsch gemacht hast.
Poste mal deinen aktuellen Code, dann kann man korrigieren wenn du was falsch gemacht hast.
Na, dann habe ich mal erbamen. Du willst REs, du bekommst REs:
Stefan
Code: Alles auswählen
import re
s = """
[stage-p]
nfsroot=nfsroot-p-20100407-001
config=configspace-p-20100403-002
[stage-t]
nfsroot=nfsroot-p-20100406-001
config=configspace-p-20100403-002
"""
conf = {}
for line in s.splitlines():
m = re.match(r'^\[(.*?)\]\s*$', line)
if m: section = m.group(1); conf[section] = {}; continue
m = re.match(r'^(.*?)\s*=\s*(.*?)\s*$', line)
if m: conf[section][m.group(1)] = m.group(2)
s = "nfsroot=@@STAGE:stage-p@VAR:nfsroot@@ " +\
"serverip=10.221.1.99 ARGS=soft,nosync @@STAGE:stage-p@VAR:config@@"
print(re.sub(
r'@@STAGE:(.*?)@VAR:(.*?)@@',
lambda m:conf[m.group(1)][m.group(2)],
s))
Ich würde den Gruppen in dem RE noch Namen geben, dann wird's IMHO etwas lesbarer. Insbesondere wenn RE und Funktion mal nicht so dicht zusammen stehen.
Code: Alles auswählen
import re
from ConfigParser import ConfigParser
def main():
template = ('nfsroot=@@STAGE:stage-p@VAR:nfsroot@@ serverip=10.221.1.99'
' ARGS=soft,nosync @@STAGE:stage-p@VAR:config@@')
expected = ('nfsroot=nfsroot-p-20100407-001 serverip=10.221.1.99'
' ARGS=soft,nosync configspace-p-20100403-002')
config = ConfigParser()
config.read('test.cfg')
result = re.sub(r'@@STAGE:(?P<stage>.*?)@VAR:(?P<var>.*?)@@',
lambda m: config.get(m.group('stage'), m.group('var')),
template)
print result
print result == expected
if __name__ == '__main__':
main()