Wie ersetzt man eine named group regex

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
tuner
User
Beiträge: 32
Registriert: Sonntag 23. April 2006, 22:17

Hallo zusammen,


leider habe ich hier keine Lösung gefunden. Kann mir hier jemand helfen?

ich habe eine Zeile, z.B.

Code: Alles auswählen

>>> line='RABBIT_PASSWORD=xyz'
und eine regex

Code: Alles auswählen

>>> lre='^RABBIT_PASSWORD=(?P<key>.*)'
Wie kann ich die Gruppe key hier ersetzen?

Gruss.
BlackJack

@tuner: Meinst Du im Ersetzungsstring? Da kann man per \g<key> darauf Bezug nehmen. Ansonsten ist die Problembeschreibung für mich zu unklar.
tuner
User
Beiträge: 32
Registriert: Sonntag 23. April 2006, 22:17

Hallo BlackJack,


also im Prinzip möchte ich eine neue Zeile bei dem key mit einem neuen String ersetzt worden ist.

Also so etwas wie:

Code: Alles auswählen

newPass = 'abc'
line='RABBIT_PASSWORD=xyz'
lre='^RABBIT_PASSWORD=(?P<key>.*)'

newline = re...(magic)
Am Ende soll

Code: Alles auswählen

newline = 'RABBIT_PASSWORD=abc'
herauskommen.

Gruss.
BlackJack

@tuner: Dann hast Du im Grunde genau das falsche in eine Gruppe gesetzt, nämlich das was Du wegwerfen/austauschen willst und nicht das was Du in der Ersetzung wiederverwenden willst. Letztendlich sind REs hier aber auch ein wenig Overkill.

Code: Alles auswählen

new_password = 'abc'
line = 'RABBIT_PASSWORD=xyz'
key, equals, value = line.partition('=')
if key == 'RABBIT_PASSWORD':
    line = key + equals + new_password
tuner
User
Beiträge: 32
Registriert: Sonntag 23. April 2006, 22:17

Hallo BlackJack,

das war ja nur ein Ausschnitt, das ganze tool verwaltet mehrere Passwörter und allein Rabbit hat seinen Pass an 6 verschiedenen Stellen, für verschiedene Applikationen..

Aber dein Post hat mich auf die Lösung gebracht..
regex:

Code: Alles auswählen

line_re='^(RABBIT_PASSWORD=)(?P<key>.*)()$'
und als substitution

Code: Alles auswählen

re.sub(lre, r'\1' + newpass + r'\3', line)
Kann man dann schön automatisieren..


Danke und Gruss,
Antonios.
BlackJack

@tuner: Da sind jetzt 2 Gruppen zu viel in dem regulären Ausdruck. Die leere Gruppe erscheint mir besonders sinnfrei. Und die Lösung kommt nicht mit Passwörtern klar in denen ein \ gefolgt von einer Ziffer vorkommt.
tuner
User
Beiträge: 32
Registriert: Sonntag 23. April 2006, 22:17

Hallo BlackJack,

das mit den zusätzlichen Gruppen passt schon, da ich an anderer Stelle den Pass abfragen muss und bei manchen stellen hinter dem Passwort weiterer Kontext folgt. Aber alle werden mit der gleichen Funktion verarbeitet..

Für die passwörter nutze ich zufällig erzeugte, ausreichend grosse folgen variabler Länge aus string.ascii_letters + string.digits.
string.punctuation wurde weggelassen, weil das bei manchen Apps zu Problemen führt und eben auch viel Overhead mit der Verwaltung der regex erzeugen würde.

Gruss.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

tuner hat geschrieben:bei manchen stellen hinter dem Passwort weiterer Kontext folgt
Dafür helfen die leeren Klammern aber nichts.
tuner
User
Beiträge: 32
Registriert: Sonntag 23. April 2006, 22:17

Ja, schon.
Da werden andere regex verwendet..

Bei mysql sieht die passwortzeile komplett unterschiedlich aus z.b.:

Code: Alles auswählen

sql_connection = mysql://service:[PASS]@localhost/service?charset=utf8
oder
MYSQL_PASSWORD=[PASS]
Wenn alle mit der gleichen Funktion ersetzt werden sollen, muss halt bei der zweiten dahinter ein leerer match gemacht werden, damit die substitution nicht zu exceptions führt..
Antworten