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?
>>> 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]
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
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.
Version itérateur
>>> import re
>>> string1 = "498results should get"
>>> [int(x.group()) for x in re.finditer(r'\d+', string1)]
[498]
>>> import itertools
>>> int(''.join(itertools.takewhile(lambda s: s.isdigit(), string1)))
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'
def function(string):
final = ''
for i in string:
try:
final += str(int(i))
except ValueError:
return int(final)
print(function("4983results should get"))
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))