Pregunta

Hola, tengo una pregunta bastante básica sobre las expresiones regulares. Solo quiero devolver el texto dentro (e incluir) las etiquetas del cuerpo, y sé que lo siguiente no es correcto porque también coincidirá con todos los caracteres antes de la etiqueta del cuerpo de apertura. Me preguntaba cómo harías para saltearlos.

x = re.match('(.*<body).*?(</body>)', fileString)

¡Gracias!

¿Fue útil?

Solución

Aquí hay un código de ejemplo que usa expresiones regulares para encontrar todo el texto entre las etiquetas <body>...</body>. Aunque esto demuestra algunas características del módulo re de Python, tenga en cuenta que el módulo Beautiful Soup es muy fácil de usar y es una mejor herramienta si planea analizar HTML o XML. (Vea a continuación un ejemplo de cómo podría analizar esto usando BeautifulSoup).

#!/usr/bin/env python
import re

# Here we have a string with a multiline <body>...</body>
fileString='''baz<body>foo
baby foo
baby foo
baby foo
</body><body>bar</body>'''

# re.DOTALL tells re that '.' should match any character, including newlines.
x = re.search('(<body>.*?</body>)', fileString, re.DOTALL)
for match in x.groups():
    print(match)
# <body>foo
# baby foo
# baby foo
# baby foo
# </body>

Si desea recoger todas las coincidencias, puede usar re.findall:

print(re.findall('(<body>.*?</body>)', fileString, re.DOTALL))
# ['<body>foo\nbaby foo\nbaby foo\nbaby foo\n</body>', '<body>bar</body>']

y si planea usar este patrón más de una vez, puede precompilarlo:

pat=re.compile('(<body>.*?</body>)', re.DOTALL)
print(pat.findall(fileString))
# ['<body>foo\nbaby foo\nbaby foo\nbaby foo\n</body>', '<body>bar</body>']

Y así es como puedes hacerlo con BeautifulSoup:

#!/usr/bin/env python
from BeautifulSoup import BeautifulSoup

fileString='''baz<body>foo
baby foo
baby foo
baby foo
</body><body>bar</body>'''
soup = BeautifulSoup(fileString)
print(soup.body)
# <body>foo
# baby foo
# baby foo
# baby foo
# </body>

print(soup.findAll('body'))
# [<body>foo
# baby foo
# baby foo
# baby foo
# </body>, <body>bar</body>]

Otros consejos

No conozco Python, pero aquí hay un ejemplo rápido combinado con Beautiful Soup , que a menudo veo recomendado para el análisis HTML de Python.

import BeautifulSoup

soup = BeautifulSoup(fileString)

bodyTag = soup.html.body.string

Eso (en teoría) tratará con todas las complejidades de HTML, lo cual es muy difícil con respuestas basadas en expresiones regulares puras, porque no es para lo que se diseñó la expresión regular.

No puede analizar HTML con regex. HTML no es un lenguaje normal. Utilice un analizador HTML como lxml en su lugar.

 x = re.match('.*(<body>.*?</body>)', fileString)

Considere minidom para el análisis HTML.

x = re.search('(<body>.*</body>)', fileString)
x.group(1)

Menos tipeo que las respuestas del partido

¿Su fileString contiene varias líneas ? En ese caso, es posible que deba especificarlo u omitir las líneas explícitamente:

x = re.match(r"(?:.|\n)*(<body>(?:.|\n)*</body>)", fileString)

o, más simplemente con el módulo re:

x = re.match(r".*(<body>.*</body>)", fileString, re.DOTALL)

x.groups()[0] debe contener su cadena si x no es None.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top