back references funktioniert nicht, wie gedacht

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
blutigeranfaenger
User
Beiträge: 63
Registriert: Dienstag 4. März 2014, 12:04

Hallo zusammen,
ich möchte einen Substring, wenn zweimal hintereinander vorkommt verändern, in meinem vereinfachten Beispiel soll aus A A A[ A] und aus c c c[ c] werden.
Bei diesem einfachen Beispiel kriege ich es zwar hin, aber ich hatte es mir mit back references einfacher vorgestellt, aber es funkioniert leider nicht, und ich kriege nicht raus, warum. Hier mein Code:

Code: Alles auswählen

#!/usr/bin/env python3
import re
Text = """
A B C D 
E F G H 
A A B A 
X Y Z F 
c c d c 
"""
# das Muster A A B A soll durch A[ A ] und c c durch c[ c] ersetzt werden
#neuerText = re.sub(r"([Ac]\s)([Ac]\s)",r"\1[ \2] ",Text) #das klappt
neuerText = re.sub(r"(?P<test>[Ac]\s)\g<test>",r"\g<test>[ \g<test>] ",Text ) # klappt nicht, wieso?
print(neuerText)
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@blutigeranfaenger: Das erste was Du auskommentiert hast, funktioniert übrigens nicht wirklich, es sei denn Du wolltest auch 'A c ' durch 'A[ c] ' und 'c A ' durch 'c[ A] ' ersetzen. Das tut das nämlich.

Der Fehler ist das '\g<test>' im *Muster* nicht das macht was Du denkst. Im Muster gibt es eine andere Syntax um sich auf eine bereits gematchte Gruppe zu beziehen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
blutigeranfaenger
User
Beiträge: 63
Registriert: Dienstag 4. März 2014, 12:04

O.k., und wie geht die andere Syntax?
Unnd die auskommentierte Zeile macht, zumindest auf meiner Kiste, was sie soll.
Jedenfalls kommt, nachdem ich das #-Zeichen versetzt habe, raus:
py3 regextest07.py
A B C D
E F G H
A [ A ] B A
X Y Z F
c [ c ] d c
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@blutigeranfaenger: Wie die andere Syntax geht, steht in der Dokumentation vom `re`-Modul. :-þ

Ich habe ja nicht gesagt das die auskommentierte Zeile das nicht macht, die macht *mehr* als was Du im Text beschrieben hast. Die Frage ist halt ob das gewünscht ist, oder nicht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
blutigeranfaenger
User
Beiträge: 63
Registriert: Dienstag 4. März 2014, 12:04

Ok, habe verstanden. Mit dem regex wäre auch z.B. A c oder c A und noch weiteres "gematched" worden. Nein, das wollte ich nicht.
Antworten