2009-09-29 19 views
7

He estado armando una lista de páginas que necesitamos actualizar con nuevo contenido (estamos cambiando los formatos de los medios). En el proceso estoy catalogando páginas que tienen correctamente el nuevo contenido.Python Regex "el objeto no tiene ningún atributo"

Aquí es la idea general de lo que estoy haciendo:

  1. Iterar a través de una estructura de archivos y obtener una lista de archivos
  2. Para cada archivo leído a un búfer y, mediante la búsqueda de expresiones regulares, que coincida con una etiqueta específica
  3. Si coincide, prueba 2 más regex coincide
  4. escribir las coincidencias resultantes (uno o el otro) en una base de datos

Todo funciona bien hasta la tercera coincidencia de patrones regulares, donde me sale el siguiente:

'NoneType' object has no attribute 'group'

# only interested in embeded content 
pattern = "(<embed .*?</embed>)" 

# matches content pointing to our old root 
pattern2 = 'data="(http://.*?/media/.*?")' 

# matches content pointing to our new root 
pattern3 = 'data="(http://.*?/content/.*?")' 

matches = re.findall(pattern, filebuffer) 
for match in matches: 
    if len(match) > 0: 

    urla = re.search(pattern2, match) 
    if urla.group(1) is not None: 
     print filename, urla.group(1) 

    urlb = re.search(pattern3, match) 
    if urlb.group(1) is not None: 
     print filename, urlb.group(1) 

gracias.

Respuesta

16

Su excepción significa que urla tiene un valor de None. Dado que el valor de urla está determinado por la llamada a la re.search, se deduce que re.search devuelve None. Y esto sucede cuando la cadena no coincide con el patrón.

Así que, básicamente, se debe utilizar:

urla = re.search(pattern2, match) 
if urla is not None: 
    print filename, urla.group(1) 

en lugar de lo que tiene ahora.

2

La razón de TypeError es que search o match normalmente devuelven un MatchObject o una None. Solo uno de estos tiene un método group. Y no es un None. Así que hay que hacer:

url = re.search(pattern2, match) 
if url is not None: 
    print(filename, url.group(0)) 

P. S.PEP-8 sugiere el uso de 4 espacios para la sangría. No es solo una opinión, es una buena práctica. Tu código es bastante difícil de leer.

+0

ah. gracias. utilizo pestañas en el código, que fueron formateadas/reinterpretadas por el motor de formateo de este sitio. "url is not None lo corrigió" – ives

0

Tenga en cuenta también su suposición errónea de que el error estaba en la tercera coincidencia, cuando de hecho estaba en la segunda. Esto parece haber llevado a la suposición errónea de que el segundo partido estaba haciendo algo para invalidar el tercero, desorientando al tercero.

2

Tengo el mismo problema.

Usando python2.6, se puede resolver de esta manera:

 
for match in matches: 
if len(match) > 0: 

    urla = re.search(pattern2, match) 
    try: 
    urla.group(1): 
    print filename, urla.group(1) 
    excpet: 
    print "Problem with",pattern2 


    urlb = re.search(pattern3, match) 
    try: 
    urlb.group(1) 
    print filename, urlb.group(1) 
    except: 
    print "Problem with",pattern3 
+0

Pequeño error: excepto: en lugar de "excpet:" para bloque de urla. –

Cuestiones relacionadas