2011-10-23 7 views
54

Questo codice fa quasi quello che ho bisogno di ..Python split() senza rimuovere il delimitatore

for line in all_lines: 
    s = line.split('>') 

Solo che rimuove tutti i '>' delimitatori.

Quindi,

<html><head> 

si trasforma in

['<html','<head'] 

C'è un modo per utilizzare il metodo, ma () diviso mantenere il delimitatore, invece di rimuoverlo?

Con questi risultati ..

['<html>','<head>'] 
+17

Questo in realtà non rispondere alla tua domanda, ma se si sta cercando di analizzare HTML in Python, mi raccomando [Beautiful Soup] (http://www.crummy.com/software/BeautifulSoup/). –

+2

Vedere anche [In Python, come posso dividere una stringa e mantenere i separatori?] (Http://stackoverflow.com/questions/2136556/in-python-how-do-i-split-a-string-and- keep-the-separatori). – outis

risposta

32
d = ">" 
for line in all_lines: 
    s = [e+d for e in line.split(d) if e] 
+3

Che funziona perfettamente ... ma non capisco completamente cosa sta succedendo. – some1

+2

@ some1 itera iteraticamente sui risultati della divisione e aggiunge nuovamente il delimitatore. "S è una lista, in cui ogni elemento in quell'elenco è e + d, dove e sono gli elementi nel risultato di line.split (d), ma solo se e non è vuoto " – JHixson

+7

Questo aggiunge un delimitatore a tutti gli elementi dell'elenco risultante, incluso un elenco di elementi singoli senza delimitatore ... Cosa succede se si _only_ volesse il delimitatore aggiunto al primo della divisione elementi? –

1

Basta dividere, allora per ogni elemento della matrice/lista (tranne l'ultimo) aggiungere un trailing ">" ad esso.

+0

E il caso di ">>" diventerebbe semplicemente ">" – paulm

10

ne dite di questo:

import re 
s = '<html><head>' 
re.findall('[^>]+>', s) 
23

Se si parsing del codice HTML con spaccature, si hanno più probabilità facendo male, a meno che non si sta scrivendo uno script di one-shot rivolta ad un fisso e sicuro file di contenuti. Se si suppone che lavori su qualsiasi input HTML, come gestirai qualcosa come <a title='growth > 8%' href='#something'>?

In ogni caso, le seguenti opere per me:

>>> import re 
>>> re.split('(<[^>]*>)', '<body><table><tr><td>')[1::2] 
['<body>', '<table>', '<tr>', '<td>']