Gå til innhold

Python, regex search med flere alternativer


Anbefalte innlegg

Leter gjennom en liten tekst der jeg vil ha tak i en link omringet av hermetegn("), mens i noen tilfeller er den omringet av apostrof(').

 

Hvordan kan jeg se etter begge tilfellene i samme søk?

Her er koden jeg har så langt:

line = re.search('<a href="(.+?)"', chunk)
if line:
    print line.group(1)

I dette tilfellet er (.+?) omringet av hermetegn. Leste man kunne bruke or(|) tegnet til å spesifisere flere alternativer, men vet ikke hva jeg gjør feil.

Her er koden som ikke fungerer, men viser ønsket resultat:

line = re.search("""<a href=("|')(.+?)('|")""", chunk)
if line:
    print line.group(1)

I følge python doc, så skal man kunne sjekke etter både " og ' ved å skrive ("|'), men noe er tydligvis feil.

Takk for all hjelp.

 

-Daniel

Lenke til kommentar
Videoannonse
Annonse
....
line = re.search("""<a href=("|')(.+?)('|")""", chunk)
if line:
    print line.group(1)

I følge python doc, så skal man kunne sjekke etter både " og ' ved å skrive ("|'), men noe er tydligvis feil.

Ser nermest korrekt ut.. ville ha gjort det litt anderledes, putte "or"-statement ("|") inni "firkant-parantes", og backslashet hermetegnet (fungerer også med re.search):

import re

if __name__ == '__main__':
  ptrn = re.compile( r"<a href=[\"|'](.+?)['|\"]" )
 
  chunk = '<a href=\"www.blabla.com\"> bla bla.. </a>' + \
          '<a href=\'http://www.lala.com\'> la la.. </a>'
          
  groups = re.findall(ptrn, chunk)
  print groups
Endret av warpie
Lenke til kommentar

Html og regex er ikke beste venner som tatt opp her

Det går som regel og knote til til noe i regex med html,men ofte gjøre en parser dette mye enklere.

Parser for Python BeautifulSoup og lxml,begge er veldig gode og viktig begge kan lese ukorrekt html.

 

Et par eksempler på og ta ut linker(a = href)

from bs4 import BeautifulSoup

html = '''\
<a href=\"www.blabla.com\"> bla bla.. </a>
<a href=\'http://www.lala.com\'> la la.. </a>'''

soup = BeautifulSoup(html)
links = soup.findAll('a') 
for link in links:
    print link['href']

lxml er kraftig og man kan bruke Xpath ('//a/@href') eller CSS select for og ta ut linker.

from lxml.html import parse

tag = parse('http://www.google.com/').getroot()
links = tag.cssselect('a')
Endret av snippsat
Lenke til kommentar

Tusen takk for svar fra begge!

Warpie: Dette var akuratt det jeg lette etter og det fungerte som det skulle. Takk for hjelpen.

Snippsat: lxml og beautifulsoup har jeg ikke tatt meg tid til å sette meg inn i enda, så bruker regex nå. Skal fokusere på å forbedre koden etter hvert med en av dem. Takk for eksemplene.

 

-Daniel

Endret av Axxxy
Lenke til kommentar
  • 1 måned senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...