2011-01-30 5 views
7

J'ai une chaîne d'entrée comme ceci: a1b2c30d40 et je veux tokenizer la chaîne à: a, 1, b, 2, c, 30, d, 40. Je sais que je peux lire chaque caractère un par un et garder une trace du caractère précédent pour déterminer si je devrais le marquer ou non (2 chiffres dans une rangée signifie ne pas le marquer) mais y a-t-il une manière plus pythonique de faire cela?fractionnement chaîne python

Répondre

13
>>> re.split(r'(\d+)', 'a1b2c30d40') 
['a', '1', 'b', '2', 'c', '30', 'd', '40', ''] 

Sur le modèle: comme le commentaire dit \d signifie « correspondre à l'un chiffre », + est un modificateur qui signifie « correspondre à un ou plusieurs », donc \d+ signifie « correspondent autant de chiffres que possible ». Ceci est mis dans un groupe (), de sorte que l'ensemble du motif dans le contexte de re.split signifie « split cette chaîne en utilisant autant de caractères que possible en tant que séparateur, capturant en outre des séparateurs adaptés dans le résultat ». Si vous omettez le groupe, vous obtiendrez ['a', 'b', 'c', 'd', ''].

+0

Umm Je ne comprends pas très bien regex. Cela vous dérange-t-il de mettre quelques explications sur le modèle (\ d +)? – Hery

+1

il se divise en chiffres/chiffres consécutifs ('\ d' est 0-9,' '+ est un ou plusieurs). – delnan

+1

http://docs.python.org/library/re.html – Samizdis

Questions connexes