2011-10-23 19 views
54

Ce code fait presque ce que je dois à ..Python split() sans enlever le séparateur

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

Sauf qu'il supprime tous les « > » délimiteurs.

Ainsi,

<html><head> 

Se transforme en

['<html','<head'] 

Y at-il un moyen d'utiliser la méthode split() mais garder le séparateur, au lieu de l'enlever?

Avec ces résultats ..

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

Cela ne répond pas vraiment à votre question, mais si vous essayez d'analyser HTML en Python, je recommande fortement [Beautiful Soup] (http://www.crummy.com/software/BeautifulSoup/). –

+2

Voir aussi [En Python, comment séparer une chaîne et conserver les séparateurs?] (Http://stackoverflow.com/questions/2136556/in-python-how-do-i-split-a-string-and- garder les séparateurs). – outis

Répondre

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

Cela fonctionne parfaitement ... mais je ne comprends pas complètement ce qui se passe. – some1

+2

@ some1 il bascule fondamentalement sur les résultats de la scission et ajoute le délimiteur. "S est une liste, où chaque élément de cette liste est e + d, où e sont les éléments dans le résultat de line.split (d), mais seulement si e n'est pas vide " – JHixson

+7

Ceci ajoute un délimiteur à tous les éléments de la liste résultante, y compris une liste à un seul élément sans délimiteur ... Que faire si vous ne vouliez que le délimiteur ajouté au premier de la scission éléments? –

1

juste de se séparer, puis pour chaque élément dans le tableau/liste (sauf la dernière) ajoutez un « > » à elle.

+0

Qu'en est-il du cas de ">>" il deviendrait simplement ">" – paulm

10

Que diriez-vous ceci:

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

Si vous analysez HTML avec splits, vous êtes le plus fait probablement mal, sauf si vous écrivez un script un Visée à un prix fixe et sécurisé fichier de contenu. S'il est supposé fonctionner sur n'importe quelle entrée HTML, comment allez-vous gérer quelque chose comme <a title='growth > 8%' href='#something'>?

Quoi qu'il en soit, les travaux suivants pour moi:

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