2010-10-19 7 views
6

sé que re.sub(pattern, repl,text) puede sustituir al patrón coincide, y luego regresar el sustituto mi código esPython: cómo sustituir y saber si se correspondía

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

tengo que definir otra variable para comprobar si modificado

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

y tiene problemas, por ejemplo text1='abc123def', pattern = '(123|456)', repl = '123', después de reemplazar, es lo mismo, por lo que matches es falso, pero en realidad coincide.

+0

por qué te sustituyendo '' 123' para 123'? – SilentGhost

+0

p. Ej. Necesito saber si contiene números. patterns = r '\ d +' –

+0

reemplaza todos los números a 123, ¿es posible? –

Respuesta

13

Uso re.subn

realizar la misma operación como sub(), pero Devuelve una tupla (nueva_cadena, number_of_subs_made).

y luego verifique el número de reemplazos que se hicieron. Por ejemplo:

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

El parámetro repl también puede ser una función que toma un objeto de coincidencia de RE y devuelve cuál debe ser el reemplazo; esta función no se llama si el texto no coincide. Podrías usar eso para hacer lo que necesitabas y luego regresar una cadena constante con la que quieras reemplazarlo. Esto reduciría una segunda verificación innecesaria contra el RE.

+0

Esto es cierto, sin embargo el 're.subn' proporciona la funcionalidad deseada con menos desorden que un parámetro 'repl' invocable. – tzot

0

"Si cadena contiene los números":

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',)) 
      )) 
Cuestiones relacionadas