2016-05-29 25 views
3

Ich möchte Substitutionen mit Regex, nicht für alle Übereinstimmungen, sondern nur für bestimmte ausführen. re.sub ersetzt jedoch alle Übereinstimmungen. Wie kann ich das machen?Ersatz spezifische Übereinstimmungen mit Regex

Hier ist ein Beispiel. Sag mal, habe ich einen String mit folgendem Inhalt:

FOO=foo1 
BAR=bar1 
FOO=foo2 
BAR=bar2 
BAR=bar3 

Was ich will, ist dies zu tun:

re.sub(r'^BAR', '#BAR', s, index=[1,2], flags=re.MULTILINE) 

das folgende Ergebnis zu erhalten.

FOO=foo1 
BAR=bar1 
FOO=foo2 
#BAR=bar2 
#BAR=bar3 
+0

, was Sie mit 'index = [1,2] '? Du meintest, dass du das zweite und dritte Spiel spielen willst? – Kasramvd

+0

Ich denke, er meinte, wenn meine Streichhölzer in einer Liste L sind, wenden Sie Änderungen auf L [1] und L [2] an, aber nicht auf L [0] – quemeraisc

+0

Ja, das stimmt. 'index = [1,2]' gibt an, welche von den mehreren Treffern dort ersetzt werden sollen. In diesem Fall möchte ich nur die zweiten und dritten Übereinstimmungen ersetzen, und zuerst ("index == 0") sollte man so belassen werden wie es ist. –

Antwort

0

Sie könnten

  1. Split Ihre Zeichenfolge mit s.splitlines()
  2. Iterate über die einzelnen Leitungen in einer for-Schleife
  3. verfolgen, wie viele Spiele Sie haben bisher
  4. gefunden
  5. Führen Sie nur Ersetzungen für diese Übereinstimmungen in den gewünschten numerischen Bereichen durch (z. B. 1 und 2)
  6. Und dann schließen Sie sie wieder an eine einzelne Zeichenfolge (falls erforderlich).
+0

Ok, das wird funktionieren ... aber sieht unraffiniert aus. Was passiert außerdem, wenn das Muster komplexer ist und Sie die Treffer nicht mit '\ n' teilen können? Danke trotzdem! –

3

Sie könnten Ersatzfunktion zu re.sub übergeben, die Spur des Grafen und prüft hält, wenn der angegebene Index ersetzt werden sollte:

import re 

s = '''FOO=foo1 
BAR=bar1 
FOO=foo2 
BAR=bar2 
BAR=bar3''' 

i = 0 
index = {1, 2} 

def repl(x): 
    global i 
    if i in index: 
     res = '#' + x.group(0) 
    else: 
     res = x.group(0) 

    i += 1 
    return res 

print re.sub(r'^BAR', repl, s, flags=re.MULTILINE) 

Ausgang:

FOO=foo1 
BAR=bar1 
FOO=foo2 
#BAR=bar2 
#BAR=bar3 
+0

Großartig, es funktioniert! Ich wusste nicht, dass man eine Funktion an das 'repl'-Argument von' re 'übergeben kann ... –

Verwandte Themen