2012-08-14 7 views
14

Este es un ejemplo sencillo:Funciones de llamada de re.sub

import re 

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

me da este error:

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

envía \\2 en lugar de 3 y 5.

¿Por qué? ¿Cómo lo soluciono?

+0

duplicado posible de [Python reemplazar patrón de encordado con la salida de la función] (http://stackoverflow.com/questions/12597370/python-replace-string-pattern-with-output-of-function) – thakis

Respuesta

24

Si desea utilizar una función con re.sub, debe pasar una función , no es una expresión. Como se documentó en here, su función debe tomar el objeto de coincidencia como argumento y devolver la cadena de reemplazo. Puede acceder a los grupos con los métodos usuales .group(n), etc. Un ejemplo:

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 ' 

Tenga en cuenta que la función debe devolver cadenas (ya que se volverán a poner en la cadena original).

+0

Sí , esta funcionando. – user1586464

6

Necesita usar la función lambda.

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

Sí, gracias por adaptar el código. – user1586464

+0

Aunque fue un ejemplo. – user1586464

Cuestiones relacionadas