2008-09-16 8 views
6

Un tutorial que tengo en Regex en python explica cómo usar el módulo re en python, quería tomar la URL de una etiqueta A para saber Regex escribí la expresión correcta y la probé en mi aplicación de pruebas regex de elección y se aseguró de que funcionó. Cuando se coloca en python falló.Python y "re"

Después de mucho rascarse la cabeza Descubrí el problema, automáticamente espera que su patrón esté al comienzo de la cadena. He encontrado una solución, pero me gustaría saber cómo cambiar:

regex = ".*(a_regex_of_pure_awesomeness)" 

en

regex = "a_regex_of_pure_awesomeness" 

Está bien, es una expresión regular URL estándar pero quería evitar cualquier posible confusión acerca de lo que quería deshacerse de y posiblemente pretender ser gracioso.

Respuesta

19

En Python, hay una distinción entre "coincidencia" y "búsqueda"; match solo busca el patrón al comienzo de la cadena, y la búsqueda busca el patrón que comienza en cualquier ubicación dentro de la cadena.

Python regex docs
Matching vs searching

1

¿Está utilizando el método re.match() o re.search()? Tengo entendido que re.match() asume un "^" al comienzo de su expresión y solo buscará al principio del texto, mientras que re.search() actúa más como las expresiones regulares de Perl y solo coincidirá con el comienzo del texto si incluye un "^" al comienzo de su expresión. Espero que ayude.

3
>>> import re 
>>> pattern = re.compile("url") 
>>> string = " url" 
>>> pattern.match(string) 
>>> pattern.search(string) 
<_sre.SRE_Match object at 0xb7f7a6e8> 
1

Probablemente está siendo entorpecido por los diferentes métodos y re.search re.match.

4
from BeautifulSoup import BeautifulSoup 

soup = BeautifulSoup(your_html) 
for a in soup.findAll('a', href=True): 
    # do something with `a` w/ href attribute 
    print a['href']