2011-01-20 16 views
19

Tengo un hilo. Vamos a llamarlo 'prueba'. Quiero probar una coincidencia para esta cadena, pero solo usando el reverso de una expresión regular.cómo probar un partido de expresiones regulares

¿Puedo hacer algo como esto:

import re

for line in f.readlines(): 
    if '<a href' in line: 
     if re.match('<a href="(.*)">', line) == 'test': 
     print 'matched!' 

? Esto, por supuesto, no parece funcionar, pero creo que podría estar cerca? Básicamente, la pregunta es ¿cómo puedo obtener para devolver solo el respaldo para la comparación?

+0

Recomiendo [Rubular] (http://rubular.com/) para desarrollar expresiones regulares, ahorra mucho tiempo. Aquí hay otra pregunta en la que ayudé a alguien con un patrón similar: http://stackoverflow.com/questions/4716787/problem-with-ruby-regular-expression –

Respuesta

18

re.match coincide solo en el beginning de la cadena.

def url_match(line, url): 
    match = re.match(r'<a href="(?P<url>[^"]*?)"', line) 
    return match and match.groupdict()['url'] == url: 

ejemplo de uso:

>>> url_match('<a href="test">', 'test') 
True 
>>> url_match('<a href="test">', 'te') 
False 
>>> url_match('this is a <a href="test">', 'test') 
False 

Si el patrón podría ocurrir en cualquier parte de la línea, utilice re.search.

def url_search(line, url): 
    match = re.search(r'<a href="(?P<url>[^"]*?)"', line) 
    return match and match.groupdict()['url'] == url: 

ejemplo de uso:

>>> url_search('<a href="test">', 'test') 
True 
>>> url_search('<a href="test">', 'te') 
False 
>>> url_search('this is a <a href="test">', 'test') 
True 

N.B: Si usted está tratando de análisis de HTML usando una expresión regular, leer RegEx match open tags except XHTML self-contained tags antes de seguir adelante.

+4

+1 Analizar HTML usando regex es muy útil como consejero sobrio. –

+0

Genial. Gracias por su respuesta. ¿Cómo reemplazaría el texto y escribiría el archivo? – jml

+1

Debo mencionar que aunque leí esa publicación, también dice que puede usar este método para un caso de uso limitado, que es lo que tengo. No quiero construir un analizador que lo abarque todo. – jml

Cuestiones relacionadas