Python-Regulärer Ausdruck, der einen Teil einer übereinstimmenden Zeichenfolge ersetzt

8

Ich habe eine Zeichenfolge, die so aussehen könnte

%Vor%

Ich überprüfe gerade die Gültigkeit mit, was gut funktioniert

%Vor%

jetzt möchte ich die Zeichenfolge ersetzen, die sich am 3. Parameter befindet. Leider kann ich nicht einfach einen stringreplace auf irgendeinen Sub-String auf der 3. Position verwenden, da der gleiche 'Sub-String' irgendwo anders in diesem String sein könnte.

mit diesem und einem re.findall,

%Vor%

Ich konnte den Inhalt der Teilzeichenkette an die 3. Stelle bringen, aber re_ ersetzt nicht die Zeichenkette, sondern gibt nur die Zeichenkette zurück, die ich ersetzen möchte: /

hier ist mein Code

%Vor%

irgendeine Idee, was ich verpasst habe?

danke! Seb

    
Seb 20.12.2010, 11:12
quelle

5 Antworten

7

In re, müssen Sie eine Ersetzung für die gesamte übereinstimmende Zeichenfolge angeben. Das bedeutet, dass Sie die Teile wiederholen müssen, die Sie nicht ersetzen möchten. Das funktioniert:

%Vor%     
Martin v. Löwis 20.12.2010 11:24
quelle
3

Wenn dein einziges Werkzeug ein Hammer ist, sehen alle Probleme wie Nägel aus. Ein regulärer Ausdruck ist ein kraftvoller Hammer, ist aber nicht das beste Werkzeug für jede Aufgabe.

Einige Aufgaben werden besser von einem Parser gehandhabt. In diesem Fall ist die Argumentliste in der Zeichenfolge wie ein Python-Tupel, so dass Sie schummeln können: Verwenden Sie den integrierten Python-Parser:

%Vor%

Wenn Sie der Eingabe nicht vertrauen können, ist ast.literal_eval sicherer als eval . Sobald Sie die Argumentliste in der dekonstruierten Zeichenkette haben, denke ich, dass Sie herausfinden können, wie Sie sie bei Bedarf wieder manipulieren und neu zusammensetzen können.

    
Paulo Scardine 20.12.2010 11:24
quelle
2

Lesen Sie die Dokumentation: re.sub gibt eine Kopie der Zeichenfolge zurück, in der jedes Vorkommen des gesamten Musters durch die Ersetzung ersetzt wird. Es kann auf keinen Fall den ursprünglichen String ändern, da Python-Strings unveränderlich sind.

Verwenden Sie Look-Ahead- und Look-Behind-Assertionen, um eine Regex zu erstellen, die nur mit dem Element selbst übereinstimmt:

%Vor%     
Karl Knechtel 20.12.2010 11:25
quelle
1

Wenn Sie dies tun möchten, ohne Regex zu verwenden:

%Vor%     
dheerosaur 20.12.2010 11:21
quelle
0

Haben Sie versucht, benannte Gruppen zu verwenden? Ссылка

Hoffentlich können Sie damit nur das 3. Spiel ausrichten.

    
Ian Oxley 20.12.2010 11:18
quelle

Tags und Links