2016-03-30 14 views
1

Ich habe den Folowing Ausdruck:Ersetzen mehrere ähnliche Strings

a = 'x11 + x111 + x1111 + x1' 

und ich möchte die folgenden ersetzen:

from_ = ['1', '11', '111', '1111'] 
to = ['2', '22', '333', '3333'] 

und daher erhalten folgendes Ergebnis:

anew = 'x22 + x333 + x3333 + x2' 

Wie kann ich das mit Python machen?

Dies ist eine ähnliche Frage zu: Python replace multiple strings. In meinem Fall werden die ersetzten Werte jedoch selbst überschrieben, wenn ich die vorgeschlagenen Antworten in der Frage verwende. Daher ist das Ergebnis in der angegebenen Verbindung 'x22 + x222 + x2222 + x2'

Antwort

1

re.sub aus der Bibliothek re (regex) kann verwendet werden, wenn Sie mehrwertige Ersetzungen durchführen müssen.

re.sub nimmt das zusätzliche Argument einer Funktion auf, in dieser Funktion können Sie die notwendigen Änderungen vornehmen. Aus der Dokumentation

re.sub(pattern, repl, string, count=0, flags=0) 

Wenn repl eine Funktion ist, wird es für jede nicht-überlappende Auftreten von Mustern genannt. Die Funktion benötigt ein einzelnes Übereinstimmungsobjekt Argument und gibt die Ersetzungszeichenfolge zurück.

(Hervorhebung von mir)

Die Regex hier ist einfach, das heißt, \d+ was bedeutet, dass Sie alle Gruppen von Ziffern passen.

Sie können den folgenden Code-Schnipsel verwenden Sie die gewünschte Ausgabe wird x22 + x333 + x3333 + x2, die die erwartete Antwort ist, den Wert der anew

import re 

a = 'x11 + x111 + x1111 + x1' 

def substitute(matched_obj): 
    from_ = ['1', '11', '111', '1111'] 
    to = ['2', '22', '333', '3333'] 
    part = matched_obj.group(0) 
    if part in from_: 
     return to[from_.index(part)] 
    return part 

anew = re.sub(r'\d+',substitute,a) 

Nach Ausführung des Programms zu erhalten. `

+0

Dank @wim für die Bearbeitung –

+0

Kein Problem. Es gibt einen Fehlermodus, den du nicht berücksichtigt hast, den ich erwähnen möchte, betrachte den Eingang 'a = 'x12'', der Ausgang sollte' 'x22'' sein, aber wegen des gierigen Regex bekommst du die Ausgabe' 'x12' ' – wim

+0

@wim Danke für die Erwähnung. Ich werde versuchen, das so schnell wie möglich zu korrigieren. (Innerhalb von 24 Stunden kann ich es nicht tun ATM, da ich bereits auf dem Bett 315 Uhr bin). Danke noch einmal. –