Expresiones regulares

Patricio Olivares polivare en lilyphilia.net
Sab Feb 24 19:48:06 CET 2007


Roylan Suarez Reyes wrote:
> def BuscaLB(listablanca, trazas):
> 	"Comprobar que la traza no este en la LB"
> 	for contador2 in range(0, len(listablanca[:-1])):#Probamos con LB
> 		patronblanco = re.compile("\*"+listablanca[contador2]+".*", re.IGNORECASE)
> 		if (patronblanco.search(trazas)):
> 			return False
> 		else:
> 			return True
> 
> "listablanca" es una lista con una serie de palabras a probar en "trazas", 
> esta contiene la cadena de squid donde realizare la busqueda... Lo que quiero 
> es que por ejemplo:
> 
> trazas contiene: 172.16.7.2 - - [08/Jan/2007:15:25:02 +0000] "GET  
> http://www.unicrom.com/Images/computadoras.gif HTTP/1.1" 403 1536 TCP_NEGA:
> 
> listablanca: ['computa', 'articulo', 'sexologia', 'etc...']

Hola,

por lo que dices no necesitas expresiones regulares, puedes hacer
una simple comparación. Otra cosa es que si la primera "blanca" no
está en la traza, la función *no* va a seguir probando con las
siguientes de la lista porque estás retornando True de inmediato.
Sospecho que no es lo que quieres.

Aqui va una versión **no probada** y sin expresiones regulares.

#-------------
def BuscaLB(blancas, traza):
    """
    Retorna False si encuentra alguna palabra de 'blancas' en
    la linea traza.
    """

    traza = traza.lower()
    for palabra in blancas:
        if palabra.lower() in traza:
            return False
    return True
#-------------

Esto asume que 'traza' es una única línea.

Si te aseguras de almacenar la lista de blancas en minúsculas, te
ahorras algunos milisegundos evitando hacer "palabra.lower()" en
cada iteración.

Claro que si se te ocurre poner 'unicrom' o 'Images' en la lista
de blancas vas a tener problemas :)... en ese caso tiene sentido
usar una expresión regular.




Más información sobre la lista de distribución Python-es