2013-03-05 16 views
6

Ich bin sehr neu in Python, in der Tat ist dies mein erstes Skript.Python re() Seltsamkeit

Ich habe Probleme mit Pythons regulären Ausdrücken. Insbesondere re.sub()

Ich habe den folgenden Code:

variableTest = "192" 
test = re.sub(r'(\$\{\d{1,2}\:)example.com(\})', r'\1' + variableTest + r'\2', searchString, re.M) 

Damit Ich versuche, so etwas wie host": "${9:example.com}" innerhalb searchString und ersetzen example.com mit einem Servernamen oder die IP-Adresse übereinstimmen.

Wenn variableTest eine IP enthält, schlägt sie fehl. Ich erhalte die folgende Fehlermeldung: sre_constants.error: invalid group reference

ich es mit variableTest gleich "127.0.0.1" getestet habe, "1", "192", "192.168". "127.0.0.1" funktioniert, der Rest nicht. Wenn ich die anderen mit einem Buchstaben vorstelle, funktioniert es auch.

variableTest ist ein String - verified mit type(variableTest)

ich total verloren bin, warum dies ist.

Wenn ich r'\1' in der Ersatzzeichenfolge entfernen, funktioniert es auch. r'\1' enthält ${\d}:, mit \d eine Zahl zwischen 1 und 999.

Jede Hilfe wird sehr geschätzt!

+1

Bitte beachten Sie, dass der Beitrag von nneonneo die tatsächliche Antwort auf Ihr Problem liefert, PurityLake's Bemerkung über Ihren Befehlsaufruf ist aber auch wahr: Sie setzen das optionale Argument 'count' mit dem Flag' re.M'. – cooltea

Antwort

8

Das Problem ist, dass in einem Ersatzzeichenfolge Ergebnis wird so ein IP in variableTest setzen:

r'\18.8.8.8\2' 

Wie Sie sehen können, die erste Gruppe Referenz zur Gruppe 18, nicht Gruppe 1. Daher re klagt über die ungültige Gruppenreferenz.

In diesem Fall sollten Sie die \g<n> syntax stattdessen verwenden:

r'\g<1>' + variableTest + r'\g<2>' 

, die erzeugt z.B. r'\g<1>8.8.8.8\g<2>'.

+0

Dies funktioniert. Vielen Dank! Pythons Regex ist seltsam :) Ich lese weiter über die verknüpfte Syntax. – tone7

1

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

Dies ist die Syntax für re.sub()

Die Art und Weise Sie scheinen die Flagge re Aufruf zu .M sollte wie Flaggen sein = re.M, sonst python es dauern wird, als ob Sie die zählen mean = re.M

es versuchen, da es das einzige, was ich

entscheiden können

auch geben mir ein Beispiel dafür, was Ihre searchString-Variable enthalten könnte

+0

Wenn ich 'flags = re.M' statt nur' re.M' verwende, bekomme ich den folgenden Fehler "sub() hat ein unerwartetes Schlüsselwort argument 'flags'" 'test = re (r '(\ $ \ {\ d {1,2} \ :) Beispiel.com (\}) ', r' \ 1 '+ VariableTest + r' \ 2 ', searchString, flags = re.M) ' – tone7

+0

Das optionale Eingabeargument' flags' in 're' wurde in Python 2.7 eingeführt. Die Fehlermeldung, die Sie erhalten, tritt wahrscheinlich auf, weil Sie eine frühere Version von Python verwenden. Überprüfen Sie [re.compile] (http://docs.python.org/2/library/re.html#re.compile) für weitere Details zur Verwendung von 're.M' – cooltea