2013-07-29 4 views
1

Salut tout le monde je tentais de trouver un moyen de changer une chaîne comme celui-ci (en python3)découpant une chaîne en plusieurs chaînes en Python

"<word>word</word>" 

en trois cordes

"<word>" "word" "</word>" 

que je Je vais mettre dans une liste. Dans un premier temps, j'ai essayé la commande strip(), mais elle ne supprime que le début et la fin de la chaîne. Ensuite, j'ai essayé une méthode plus compliquée pour lire le texte une lettre à la fois, construire le mot, et ajouter un "" après "" tout en utilisant une instruction IF, mais je ne pouvais pas comprendre comment ajouter un espace avant le autre "<". Est-ce que c'est un moyen simple de diviser ces mots? Edit: Ce ne sont pas toutes mes données, je lis dans un fichier xml et en utilisant une classe de pile pour m'assurer que le fichier est équilibré.

<word1></word1> <word2>worda</word2> <word3>wordb</word3> <word4></word4>... 

Edit2: Merci pour toutes les réponses tout le monde! Je voterais toutes vos réponses si je le pouvais. Pour une utilisation pratique l'analyseur XML a bien fonctionné mais pour ce dont j'avais besoin, la commande regex a parfaitement fonctionné. Je vous remercie!

+1

La fonction split() est plus proche de ce dont vous avez besoin, mais pas exactement. Si vous essayez d'analyser html/xml, vous devez utiliser une bibliothèque d'analyse. C'est une tâche moins que triviale. –

+0

Est-ce l'étendue de vos données d'entrée? –

+2

"Je lis dans un fichier XML" - alors vous devriez probablement utiliser un analyseur XML. Python en a quelques uns différents disponibles dans le module 'xml'. – l4mpi

Répondre

1

Regex avec la méthode replace d'une chaîne fonctionne:

>>> import re 
>>> s = "<word1></word1> <word2>worda</word2> <word3>wordb</word3> <word4></word4>" 
>>> re.findall("\S+", s.replace(">", "> ").replace("<", " <")) 
['<word1>', '</word1>', '<word2>', 'worda', '</word2>', '<word3>', 'wordb', '</word3>', '<word4>', '</word4>'] 
>>> 

Ou, une solution de rechange qui n'utilise pas Regex:

>>> s = "<word1></word1> <word2>worda</word2> <word3>wordb</word3> <word4></word4>" 
>>> s.replace(">", "> ").replace("<", " <").split() 
['<word1>', '</word1>', '<word2>', 'worda', '</word2>', '<word3>', 'wordb', '</word3>', '<word4>', '</word4>'] 
>>> 

La solution Regex permet bien plus de contrôle sur la correspondance (vous pouvez en ajouter plus à l'expression pour la simplifier). Notez cependant que cela ne fonctionnera que si les données sont comme les exemples donnés.

1

Je crois que vous recherchez la méthode split.

input.split(">") 

Vous devrez peut-être ajouter les équerres après la division. cela dépend en quelque sorte si vous serez toujours dans ce modèle.

Il peut être préférable d'utiliser une bibliothèque si votre entrée suit un modèle de variable.

http://docs.python.org/2/library/htmlparser.html

+0

Je ne suis pas sûr que cela fonctionnera dans ce cas, avec une entrée donnée par OP, cela produira la sortie: ['

+0

à droite c'est pourquoi j'ai mentionné qu'il devrait ajouter les équerres après la division. Il aurait besoin d'une déclaration qui dit que si un mot commence avec un crochet d'angle gauche puis ajouter un support d'angle droit à la fin. et oui il devrait resplitter les portions de secondes qui ne commencent pas par une - créant un algorithme d'analyse cauchemardesque. – woodlumhoodlum

+0

Ah! Ok, je sais d'où tu viens. –

2

Vous devez utiliser l'analyseur XML pour cela. Voici un exemple d'analyse,

>>> import xml.etree.ElementTree as ET 
>>> xml = '<root><word1>my_word_1</word1><word2>my_word_2</word2><word3>my_word_3</word3></root>'; 
>>> tree = ET.fromstring(xml); 
>>> for child in tree: 
...  print child.tag, child.text 
... 
word1 my_word_1 
word2 my_word_2 
word3 my_word_3 
>>> 

une fois que vous avez lu les valeurs, les pousser dans une pile est facile.

Questions connexes