J'ai la ficelle

var = '7 msecs'
#var = int(var)
#var = float(var)

Et je veux convertir cela en un entier (7) ou en float (7.0). Cette conversion fonctionne en javascript, car elle semble prendre la première valeur avant les valeurs non numériques suivantes.

Comment puis-je faire cela en Python?

Je veux un bon moyen de le faire, sans avoir à le faire

var = int(var.split(' ')[0])

Cela devrait également fonctionner pour:

'10mm' or '10.55€' 

Considéré comme doublon (Python: extraire des nombres d'une chaîne)

Cette question est différente, car j'essaie de reproduire la capacité de parseInt / parseFloat en javascript qui ne renvoie que les chiffres au début d'une chaîne. Cette autre question recherche tous les nombres dans une chaîne.

#What I want:
'123mm' -> 123
'123mm1' -> 123
-2
Islarf 8 août 2016 à 12:32

4 réponses

Meilleure réponse

Si vous avez un espace blanc, utilisez split:

>>> s = "123 msecs2"
>>> int(s.split()[0])
123

Si vous souhaitez prendre les chiffres du début d'une chaîne uniquement sans espace blanc (ou en utilisant l'expression régulière), essayez ceci:

>>> s = "123msecs2"
>>> int("".join(list(next(iter(())) if not x.isdigit() else x for x in s)))
123

Remarque, il s'inspire de la discussion ici sur la rupture des compréhensions de liste.

1
Community 23 mai 2017 à 12:14

C'est déjà répondu ici: Python: extraire des nombres d'une chaîne

Vous pouvez utiliser une expression régulière pour extraire tous les nombres d'une chaîne:

>>> import re
>>> s = "7 msecs"
>>> re.findall(r"\d+", s)
["7"]

Si vous ne voulez que le premier nombre de la chaîne en entier, vous pouvez utiliser:

>>> import re
>>> s = "7 msecs"
>>> int(re.findall(r"\d+", s)[0])
7
-1
Community 23 mai 2017 à 12:08

Si vous voulez éviter d'importer des expressions régulières, vous pouvez essayer d'utiliser isdigit(). Mais pour ce que ça vaut, je préfère int(var.split()[0]) à ceci:

var = '7 msecs'
numeric_end = 0
for i in xrange(len(var)):
    if not var[i].isdigit():
        numeric_end = i
        break

print int(var[:numeric_end])

J'ai choisi de suivre l'index du premier caractère non numérique au lieu de construire une chaîne pour de légères raisons de mémoire / performances. Cela extrait également uniquement le premier nombre de la chaîne.

Bien sûr, cela ne fonctionnera que pour les pouces. Pour un flottant, vous devez également accepter le caractère . (et probablement suivre si vous devez déjà déterminer s'il s'agit d'une chaîne flottante valide).

-1
Karin 8 août 2016 à 09:53

Si var = '7 msecs'

Par filtre :

int(filter(str.isdigit, var))

Par Regex :

import re
p = re.compile(ur'\d')
re.search(p, var)

Ou par rejoindre :

s = ''.join(x for x in var if x.isdigit())
print int(s)
7
-1
bhansa 8 août 2016 à 09:47