2009-09-04 15 views
17

Come se ho una stringa come str1 = "IWantToMasterPython"Come estrarre una stringa tra 2 altre stringhe in python?

Se voglio estrarre "Py" dalla stringa di cui sopra. Scrivo:

extractedString = foo("Master","thon") 

voglio fare tutto questo perché sto cercando testi da una pagina HTML per l'estrazione. I testi sono scritti come <div class = "lyricbox"> ....lyrics goes here....</div>.

Eventuali suggerimenti su come implementare.

risposta

30

La soluzione è quella di utilizzare un regexp:

import re 
r = re.compile('Master(.*?)thon') 
m = r.search(str1) 
if m: 
    lyrics = m.group(1) 
+1

Nicely risposto. Esattamente quello che volevo sapere. Thanx –

8
def foo(s, leader, trailer): 
    end_of_leader = s.index(leader) + len(leader) 
    start_of_trailer = s.index(trailer, end_of_leader) 
    return s[end_of_leader:start_of_trailer] 

questo solleva ValueError se il leader non è presente nella stringa s, oppure il rimorchio non è presente dopo che (non è stato specificato quale comportamento vuoi in condizioni così anomale, sollevare un'eccezione è una cosa piuttosto naturale e pitonica da fare, lasciando che il chiamante gestisca ciò con un tentativo/eccetto se sa cosa fare in questi casi).

Un approccio basato su RE è anche possibile, ma penso che questo approccio a stringa pura sia più semplice.

2

Se si stanno estraendo dati da una pagina html, suggerisco caldamente di utilizzare la libreria BeautifulSoup. L'ho usato anche per estrarre dati da html e funziona benissimo.

11

BeautifulSoup è il modo più semplice per fare ciò che vuoi. Può essere installato come:

sudo easy_install beautifulsoup 

Il codice di esempio per fare quello che vuoi è:

from BeautifulSoup import BeautifulSoup 

doc = ['<div class="lyricbox">Hey You</div>'] 
soup = BeautifulSoup(''.join(doc)) 
print soup.find('div', {'class': 'lyricbox'}).string 

È possibile utilizzare Python di urllib per afferrare il contenuto dalla URL direttamente. Lo Beautiful Soup doc è anche utile se vuoi fare qualche altra analisi.

+1

Questo è sicuramente il modo corretto di farlo per quello che dice di usarlo. – wxs

+0

+1, che aiuta notevolmente ... grazie – mshsayem

+1

Ben messo. Questo è il mio scopo. Aiuta davvero. –

2

Si può anche provare questo se la vorrebbe tutta l'output occorrenze in un elenco:

import re 
str1 = "IWantToMasterPython" 

out = re.compile('Master(.*?)thon', re.DOTALL | re.IGNORECASE).findall(str1) 
if out : 
    print out 
Problemi correlati