2009-09-04 30 views
17

Al igual que si tengo una cadena como str1 = "IWantToMasterPython"¿Cómo extraer una cadena entre otras 2 cadenas en python?

Si quiero extraer "Py" de la cadena anterior. Escribo:

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

Quiero hacer todo esto porque estoy tratando de extraer letras de una página html. Las letras están escritas como <div class = "lyricbox"> ....lyrics goes here....</div>.

Cualquier sugerencia sobre cómo puedo implementar.

Respuesta

30

La solución es utilizar una expresión regular:

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

Muy bien contestadas. Exactamente lo que quería saber 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] 

esto plantea ValueError si el líder no está presente en la cadena s, o el remolque no está presente después de eso (que no ha especificado qué comportamiento lo que quiere en condiciones anómalas, levantar una excepción es una cosa bastante natural y pitonica, dejar que la persona que llama maneje eso con una prueba/excepto si sabe qué hacer en tales casos).

Un enfoque basado en RE también es posible, pero creo que este enfoque de cadena pura es más simple.

2

Si está extrayendo cualquier información de una página html, le sugiero que use la biblioteca BeautifulSoup. Lo usé también para extraer datos de html y funciona muy bien.

11

BeautifulSoup es la forma más fácil de hacer lo que quiere. Puede ser instalado como:

sudo easy_install beautifulsoup 

El código de ejemplo para hacer lo que quieres es:

from BeautifulSoup import BeautifulSoup 

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

Puede usar Python de urllib para agarrar el contenido de la URL directamente. El Beautiful Soup doc también es útil si desea realizar un análisis más detallado.

+1

Esta es definitivamente la manera correcta de obtener lo que él dice que lo está usando. – wxs

+0

+1, eso ayuda mucho ... gracias – mshsayem

+1

Bien puesto. Ese es mi propósito. Realmente ayuda. –

2

También puede probar esto si su gustaría que todas las ocurrencias de la salida en una lista:

import re 
str1 = "IWantToMasterPython" 

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