Python Regex “objeto no tiene atributo”

He estado armando una lista de páginas que necesitamos actualizar con nuevo contenido (estamos cambiando los formatos de medios). En el proceso estoy catalogando páginas que tienen correctamente el nuevo contenido.

Aquí está 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 en un búfer y, mediante la búsqueda de expresiones regulares, haga coincidir una etiqueta específica
  3. Si coincide, prueba 2 partidos de expresiones regulares más
  4. escriba las coincidencias resultantes (una o la otra) en una base de datos

Todo funciona bien hasta la tercera coincidencia de patrón de expresiones regulares, donde obtengo lo siguiente:

'NoneType' object has no attribute 'group'

 # only interested in embeded content pattern = "(<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.

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

Así que básicamente deberías usar:

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

En lugar de lo que tienes ahora.

El motivo de TypeError es que la search o la match generalmente devuelven un MatchObject o un None . Solo uno de estos tiene un método de group . Y no es un None . Así que tienes que hacer:

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

PS PEP-8 sugiere usar 4 espacios para la sangría. No es solo una opinión, es una buena práctica. Su código es bastante difícil de leer.

Tengo el mismo problema.

Usando python2.6, puedes resolverlo de esta manera:

 para el partido en los partidos:
  si len (match)> 0:

   urla = re.search (pattern2, match)
   tratar:  
    urla.group (1):
    imprimir nombre de archivo, urla.group (1)
   excpet
    Imprimir "Problema con", patrón2


   urlb = re.search (pattern3, match)
   tratar:
    urlb.group (1)
    imprimir nombre de archivo, urlb.group (1)
   excepto:
    Imprimir "Problema con", patrón 3

Tenga en cuenta también su suposición errónea de que el error se produjo en el tercer partido, cuando en realidad fue en el segundo. Esto parece haber llevado a la suposición errónea de que la segunda coincidencia estaba haciendo algo para invalidar a la tercera, lo que lo desvió del camino.