2012-08-14 9 views
14

Dies ist ein einfaches Beispiel:Anruffunktionen von re.sub

import re 

math='<m>3+5</m>' 
print re.sub(r'<(.)>(\d+?)\+(\d+?)</\1>', int(r'\2') + int(r'\3'), math) 

Es gibt mir diese Fehlermeldung:

ValueError: invalid literal for int() with base 10: '\\2' 

Es sendet \\2 statt 3 und 5.

Warum? Wie löse ich es?

+0

Mögliches Duplikat [Python Bespannbild ersetzen mit Ausgabe der Funktion] (http://stackoverflow.com/questions/12597370/python-replace-string-pattern-with-output-of-function) – thakis

Antwort

24

Wenn Sie eine Funktion mit re.sub verwenden möchten, müssen Sie eine Funktion, kein Ausdruck übergeben. Wie dokumentiert here, sollte Ihre Funktion das Match-Objekt als ein Argument und gibt die Ersatzzeichenfolge zurück. Sie können auf die Gruppen mit den üblichen Methoden .group(n) zugreifen und so weiter. Ein Beispiel:

re.sub("(a+)(b+)", lambda match: "{0} as and {1} bs ".format(
    len(match.group(1)), len(match.group(2)) 
), "aaabbaabbbaaaabb") 
# Output is '3 as and 2 bs 2 as and 3 bs 4 as and 2 bs ' 

Beachten Sie, dass die Funktion Zeichenfolgen zurückgeben sollte (da sie wieder in die ursprüngliche Zeichenfolge eingefügt werden).

+0

Ja , es funktioniert. – user1586464

6

Sie müssen die Lambda-Funktion verwenden.

print re.sub(r'<(.)>(\d+?)\+(\d+?)</\1>', lambda m: str(int(m.group(2)) + int(m.group(3))), math) 
+1

Ja, danke für die Anpassung des Codes. – user1586464

+0

Obwohl es ein Beispiel war. – user1586464

Verwandte Themen