2010-11-18 7 views
0

Je veux diviser une chaîne en une liste en python, en fonction de chiffre/pas de chiffre. Par exemple,Comment diviser une chaîne (en utilisant regex?) En fonction du chiffre/pas chiffre

5 55+6+ 5/ 

devrait retourner

['5','55','+','6','+','5','/'] 

J'ai un code au moment où une boucle à travers les personnages dans une chaîne et les tests à l'aide re.match ("\ d") ou ("\RÉ"). Je me demandais s'il y avait une meilleure façon de le faire.

PS: doit être compatible avec Python 2.4

+0

Tokenisation, je suppose? – delnan

+0

Ouais, à peu près. C'est pour une calculatrice de notation polonaise inversée, donc je ne pouvais pas supposer qu'il y avait toujours un espace entre les personnages (je ne savais pas qu'il y avait un nom pour ce que je voulais faire jusqu'à présent.) Merci de me l'avoir dit. – rikkit

Répondre

5

En supposant que les + entre 6 et 5 doit être adaptée (que vous êtes absent),

>>> import re 
>>> s = '5 55+6+ 5/' 
>>> re.findall(r'\d+|[^\d\s]+', s) 
['5', '55', '+', '6', '+', '5', '/'] 
+1

Superbe motif, mais il semblerait que vous aussi puissiez utiliser findall. Vous n'avez pas non plus besoin du '\ s *' final dans le motif, mais cela ne fait pas mal non plus. +1 –

+0

@Justin: Droit. Actualisé. – kennytm

+0

Merci! re.findall était exactement ce que je cherchais. Utilisé "[] + | \ d + |^\ d" à la fin (besoin de plusieurs chiffres consécutifs, mais pas de chiffres séparés). – rikkit

0

Si l'ordre n'a pas d'importance, vous pourrait faire 2: grand écart

re.split('\D+', mystring) 

re.split('\d+', mystring) 

Cependant, à partir de votre entrée, il semble que cela pourrait être mathématique ... dans quel ordre de cas serait question. :)

Il est préférable d'utiliser re.findall, comme dans l'une des autres réponses.

+0

Ouais, c'est pour une calculatrice de notation polonaise inverse - l'ordre compte vraiment! – rikkit

2

celui-ci est plus simple :)

re.findall('\d+|[^\d]+','134aaaaa') 
+0

il ne mange pas les espaces, essayez-le sur l'entrée d'échantillon ... –

1

Utilisez findall ou finditer:

>>> re.findall(r'\d+|[^\s\d]+', '5 55+6+ 5/') 
['5', '55', '+', '6', '+', '5', '/'] 
Questions connexes