Le blog: Web, Python, Django, Javascript ...

Python Quizz: un découpage bien régulier

Revoici, après une longue absence, un python quizz. Comment découper une chaîne de caractères selon un élément variable? Par exemple: comment découper la chaine suivante selon le numéro qui précède chaque titre d'un groupe bien connu?

s= """1- Hey Jude. 2- Let it be. 3- Black bird
4- Something 5- Norvegian wood. 6- Yellow submarine
7- Hard day's night 8- Love me do 9- Here comes the sun
10- Obladi Oblada
"""

Mise à jour du 6 novembre 2011 : ma réponse

Merci à lothiraldan pour la réponse et pardon pour la question pas très claire. L'idée était bien d'obtenir la liste suivante : 

['Hey Jude.', 'Let it be.', 'Black bird', 'Something', 'Norvegian wood.', 'Yellow submarine', "Hard day's night", 'Love me do', 'Here comes the sun', 'Obladi Oblada']

On pourrait être tenté d'utiliser la méthode split de la classe string en cherchant un séparateur fixe. Mais ici l'élément séparateur est un numéro qui change pour chaque élément.

Heureusement, les expressions régulières sont là pour nous aider. Si l'écriture d'une expression régulière est parfois un véritable art, il faut reconnaître que cela peut se révéler un outil très puissant et vraiement simplifier des algorithmes de traitement de chaînes.

Dans notre cas, le module re, propose une méthode split qui, comme la méthode de la string, permet de découper selon un séparateur. Celui est alors un motif d'expression régulière et permet donc d'avoir un séparateur "variable".

Voici donc ma proposition. Il y a surement d'autres façons de faire. N'hésitez pas si vous avez des propositions d'améliorations.

import re
print [x.strip() for x in re.split('\d+-', s) if x]


Commentaires rss
Posté par lothiraldan le mardi 01 novembre 2011 à 17:17
La question est pas très claire, mais tentons quand même:

1) On clean un peu la string:
s = s.replace('\n', ' ').replace(' ', ' ').rstrip()

2) On split:
m = re.split(' ?(\d{1,2})- ', s)[1:] #Premier élément vide

3) Bonus, on en fait un dict:
d = dict(zip(m[::2], m[1::2]))

Je suis pas sûr d'avoir répondu à la question ni que ma solution soit la meilleure (loin de là je pense) mais ça a l'air de marcher, c'est sympa de faire de proposer des quizz python comme ça.

Nom: Email: URL: Commentaire: Si vous saisissez quelque chose dans ce champ, votre commentaire sera considéré comme étant indésirable: Captcha: captcha

Luc JEAN

09.65.20.15.70

ljean@apidev.fr

Luc JEAN

Suivez les nouveautés

Wikio RSS  RSS Blog Python Django selenium Rss commentaires
Paperblog : Les meilleurs actualités issues des blogs Follow luc_apidev on Twitter