2010-10-19 5 views
6

Ich weiß, dass re.sub(pattern, repl,text) ersetzen kann, wenn Muster übereinstimmt, und dann wieder die Ersatz mein CodePython: Wie zu ersetzen und wissen, ob es angepasst

text = re.sub(pattern, repl, text1) 

Ich habe eine andere Variable zu definieren, ob es sich um zu überprüfen, modifiziert

text2 = re.sub(pattern, repl, text1) 
matches = text2 != text1 
text1 = text2 

und, hat es Probleme, z text1='abc123def', pattern = '(123|456)', repl = '123', nach ersetzen, ist es gleich, so matches ist falsch, aber es stimmt tatsächlich überein.

+0

warum Ersetzen Sie '123' für' 123'? – SilentGhost

+0

z.B. Ich muss wissen, ob es Zahlen enthält. Muster = r '\ d +' –

+0

Ersetze alle Zahlen auf 123, ist das möglich? –

Antwort

13

Verwenden re.subn

Führen des gleichen Vorgangs wie sub(), aber ein Tupel zurückgeben (new_string, number_of_subs_made).

und dann die Anzahl der Ersetzungen überprüfen. Zum Beispiel:

text2, numReplacements = re.subn(pattern, repl, text1) 
if numReplacements: 
    # did match 
else: 
    # did not match 
1

Der Parameter repl kann auch eine Funktion sein, die ein RE-Match-Objekt akzeptiert und zurückgibt, was der Ersatz sein soll; Diese Funktion wird nicht aufgerufen, wenn der Text nicht übereinstimmt. Sie können das verwenden, um das zu tun, was Sie brauchen, und dann einfach eine konstante Zeichenkette zurückgeben, mit der Sie es ersetzen möchten. Dies würde einen unnötigen zweiten Check gegen den RE reduzieren.

+0

Dies ist richtig, jedoch liefert "ren" die gewünschte Funktionalität mit weniger Unordnung als ein aufrufbarer "repl" -Parameter. – tzot

0

"Ob Zeichenfolge enthält Zahlen":

for text1 in ('abc123def', 'adsafasdfafdsafqw', 'fsadfoi81we'): 
    print("Text %s %s numbers." % 
      ((text1,) + (
       ('does not contain',) if not any(c.isdigit() for c in text1) 
       else ('contains',)) 
      )) 
Verwandte Themen