Quelle est la façon la plus propre d'obtenir le préfixe numérique d'une chaîne en Python?

Par "propre", je veux dire simple, court, lisible. Je ne me soucie pas des performances, et je suppose que c'est de toute façon difficilement mesurable en Python.

Par exemple:

Étant donné la chaîne '123abc456def', quelle est la façon la plus propre d'obtenir la chaîne '123'?

Le code ci-dessous obtient '123456':

input = '123abc456def'
output = ''.join(c for c in input if c in '0123456789')

Je cherche donc essentiellement un moyen de remplacer le if par un while.

25
barak manos 8 mars 2016 à 15:01

9 réponses

Meilleure réponse

Vous pouvez utiliser itertools.takewhile qui itérera sur votre chaîne (l'argument itérable ) jusqu'à ce qu'il rencontre le premier élément qui renvoie False (en passant à la fonction de prédicteur):

>>> from itertools import takewhile
>>> input = '123abc456def'
>>> ''.join(takewhile(str.isdigit, input))
'123'
56
Matthieu M. 8 mars 2016 à 14:01

Une autre version regexp supprime tout en commençant par le premier non-digit:

import re
output = re.sub('\D.*', '', input)
0
Marius Gedminas 22 mars 2016 à 09:39

Voici ma façon:

output = input[:next((i for i,v in enumerate(input) if not v.isdigit()),None)]
1
zondo 8 mars 2016 à 12:09

Une façon, mais pas très efficace car elle fonctionne sur toute la chaîne sans break serait:

input_string = '123abc456def'
[input_string[:c] for c in range(len(input_string)) if input_string[:c].isdigit()][-1]

Cela ajoute chaque sous-chaîne avec une taille croissante s'il s'agit d'un chiffre, puis l'ajoute. Le dernier élément est donc celui que vous recherchez. Parce que c'est la plus longue chaîne de départ qui est encore un chiffre.

1
MSeifert 8 mars 2016 à 12:16

C'est le moyen le plus simple d'extraire une liste de nombres d'une chaîne:

>>> import re
>>> input = '123abc456def'
>>> re.findall('\d+', s)
['123','456']

Si vous avez besoin d'une liste d'int, vous pouvez utiliser le code suivant:

   >>> map(int, re.findall('\d+', input ))
   [123,456]

Et maintenant, vous pouvez accéder au premier élément [0] de la liste ci-dessus

13
Tal Avissar 8 mars 2016 à 12:16

Version plus simple (en laissant l'autre réponse car il y a un débat intéressant sur la meilleure approche)

input[:-len(input.lstrip("0123456789"))]
5
demented hedgehog 8 mars 2016 à 14:18
input[:len(input) - len(input.lstrip("0123456789"))]
3
demented hedgehog 8 mars 2016 à 12:59
input = '123abc456def'
output = re.findall(r'^\d+', input)

Renverra également ['123'].

0
Xiflado 10 avril 2016 à 20:41

Vous pourriez utiliser regex

import re
initialNumber = re.match(r'(?P<number>\d+)', yourInput).group('number')
1
Mr. E 8 mars 2016 à 12:23