Domanda

Ehi, ho una domanda abbastanza semplice sulle espressioni regolari. Voglio solo restituire il testo all'interno (e includendo) i tag body e so che quanto segue non è corretto perché corrisponderà anche a tutti i caratteri prima del tag body iniziale. Mi chiedevo come avresti potuto saltare quelli?

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

Grazie!

È stato utile?

Soluzione

Ecco un esempio di codice che utilizza regex per trovare tutto il testo tra <body>...</body> tag. Sebbene ciò dimostri alcune funzionalità del modulo re di python, nota che il Beautiful Soup è molto facile da usare ed è uno strumento migliore da utilizzare se si prevede di analizzare HTML o XML. (Vedi sotto per un esempio di come potresti analizzarlo 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>

Se desideri raccogliere tutte le partite, puoi utilizzare re.findall:

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

e se prevedi di utilizzare questo modello più di una volta, puoi pre-compilarlo:

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

Ed ecco come puoi farlo 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>]

Altri suggerimenti

Non conosco Python, ma ecco un breve esempio messo insieme usando Beautiful Soup , che spesso vedo consigliato per l'analisi HTML di Python.

import BeautifulSoup

soup = BeautifulSoup(fileString)

bodyTag = soup.html.body.string

Ciò (in teoria) affronterà tutte le complessità dell'HTML, che è molto difficile con risposte basate su regex pure, perché non è ciò per cui regex è stato progettato.

Non puoi analizzare HTML con regex. HTML non è un linguaggio normale. Utilizzare invece un parser HTML come lxml.

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

Valuta la minidom per l'analisi HTML.

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

Meno digitazione rispetto alle risposte della partita

Il tuo fileString contiene più righe ? In tal caso, potrebbe essere necessario specificarlo o saltare esplicitamente le righe:

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

o, più semplicemente con il modulo re:

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

x.groups()[0] dovrebbe contenere la tua stringa se x non è None.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top