2010-08-22 18 views
16

Necesito encontrar, procesar y eliminar (uno por uno) cualquier subcadena que responden a un tiempo bastante largo de expresiones regulares:pitón y reemplazar

# p is a compiled regex 
# s is a string 
while 1: 
    m = p.match(s) 
    if m is None: 
     break 
    process(m.group(0)) #do something with the matched pattern 
    s = re.sub(m.group(0), '', s) #remove it from string s 

El código anterior no es bueno por 2 razones:

  1. no funciona si m.group (0) pasa a contener caracteres de expresiones regulares-especial (como *, +, etc.).

  2. Parece que estoy duplicando el trabajo: primero busco el hilo para la expresión regular, y luego tengo que ir a buscarlo de nuevo para eliminarlo.

¿Qué es una buena forma de hacerlo?

Respuesta

19

La función re.sub puede tener una función como argumento para que pueda combinar los pasos de reemplazo y procesamiento si lo desea:

# p is a compiled regex 
# s is a string 
def process_match(m): 
    # Process the match here. 
    return '' 

s = p.sub(process_match, s) 
+0

Gracias, se olvidó de eso .. – max

+0

Ah, y me di cuenta de qué hacer al respecto si yo quiero reemplazar una cadena que puede contener símbolos de expresiones regulares en ella .. re.escape (s) se encarga de eso. – max

+0

lo siento pero lo que es p? – CodyBugstein