Regex dentro de las tags html

Me gustaría analizar el precio en HD del siguiente snipper de HTML. Solo tengo fragmentos del código html, por lo que no puedo usar un analizador HTML para esto.

View In iTunes £19.99
  • HD Version

Básicamente, el formato sería “Buscar el precio antes de la palabra” Versión HD “(no distingue mayúsculas y minúsculas). Esto es lo que tengo hasta ahora:

 re.match(r'^(\d|.){1,6}...HD\sVersion', string) 

¿Cómo extraería el valor “19.99” de la cadena anterior?

BeautifulSoup es muy indulgente con el HTML que analiza, también puede usarlo para los trozos / partes de HTML:

 # -*- coding: utf-8 -*- from bs4 import BeautifulSoup data = u""" 
View In iTunes £19.99
  • HD Version
  • """ soup = BeautifulSoup(data) print soup.find('span', class_='price').text[1:]

Huellas dactilares:

 19.99 

Has pedido una expresión regular aquí, pero no es la herramienta adecuada para analizar HTML. Utilice BeautifulSoup para esto.

 >>> from bs4 import BeautifulSoup >>> html = ''' 
View In iTunes £19.99
  • HD Version
  • ''' >>> soup = BeautifulSoup(html) >>> val = soup.find('span', {'class':'price'}).text >>> print val[1:] 19.99

Aún puedes analizar usando BeautifulSoup , no necesitas el html completo:

 from bs4 import BeautifulSoup html=""" 
View In iTunes £19.99
  • HD Version
  • """ soup = BeautifulSoup(html) sp = soup.find(attrs={"class":"price"}) print sp.text[1:] 19.99

Las respuestas actuales de BeautifulSoup solo muestran cómo tomar todas las tags . Este es mejor:

 from bs4 import BeautifulSoup soup = """
View In iTunes £19.99
  • HD Version
  • """ for HD_Version in (tag for tag in soup('li') if tag.text.lower() == 'hd version'): price = HD_Version.parent.findPreviousSibling('span', attrs={'class':'price'}).text

En general, el uso de expresiones regulares para analizar un lenguaje irregular como HTML está pidiendo problemas. Quédate con un analizador establecido.

Puedes usar esta expresión regular:

 \d+(?:\.\d+)?(?=\D+HD Version) 
  • \D+ salta delante de los no dígitos en un lookahead, afirmando efectivamente que nuestra coincidencia ( 19.99 ) es el último dígito delante de la HD Version .

Aquí hay una demostración de expresiones regulares .

Utilice el modificador i en la expresión regular para hacer que la combinación no distinga mayúsculas de minúsculas y cambie + a * si el número puede estar directamente antes de la HD Version .