web-dev-qa-db-fra.com

Comment obtenir des valeurs entières d'une chaîne en Python?

Supposons que j'avais une ficelle

string1 = "498results should get" 

Maintenant, je dois obtenir uniquement des valeurs entières de la chaîne comme 498. Ici, je ne veux pas utiliser list slicing car les valeurs entières peuvent augmenter comme dans les exemples suivants:

string2 = "49867results should get" 
string3 = "497543results should get" 

Donc, je veux obtenir uniquement des valeurs entières de la chaîne exactement dans le même ordre. Je veux dire comme 498,49867,497543 de string1,string2,string3 respectivement.

Quelqu'un peut-il me dire comment faire cela en une ou deux lignes?

36
>>> import re
>>> string1 = "498results should get"
>>> int(re.search(r'\d+', string1).group())
498

S'il y a plusieurs entiers dans la chaîne:

>>> map(int, re.findall(r'\d+', string1))
[498]
82
jamylak

Une réponse tirée de ChristopheD ici: https://stackoverflow.com/a/2500023/1225603

r = "456results string789"
s = ''.join(x for x in r if x.isdigit())
print int(s)
456789
35
Sepero

si vous avez plusieurs ensembles de nombres, ceci est une autre option.

>>> import re
>>> print(re.findall('\d+', 'xyz123abc456def789'))
['123', '456', '789']

son pas bon pour les chaînes de nombres à virgule flottante cependant.

11
jacanterbury

Version itérateur

>>> import re
>>> string1 = "498results should get"
>>> [int(x.group()) for x in re.finditer(r'\d+', string1)]
[498]
8
John La Rooy
>>> import itertools
>>> int(''.join(itertools.takewhile(lambda s: s.isdigit(), string1)))
7
Craig Citro

Voici votre one-liner, sans utiliser d'expressions régulières, ce qui peut parfois coûter cher:

>>> ''.join(filter(str.isdigit, "1234GAgade5312djdl0"))

résultats:

'123453120'
6
Bobort
def function(string):  
    final = ''  
    for i in string:  
        try:   
            final += str(int(i))   
        except ValueError:  
            return int(final)  
print(function("4983results should get"))  
0
Kishor Subedi

Avec Python 3.6, ces deux lignes renvoient une liste (peut être vide)

>>[int(x) for x in re.findall('\d+', your_string)]

Semblable à

>>list(map(int, re.findall('\d+', your_string))
0
huseyin39