85

Suppose I had a string

string1 = "498results should get" 

Now I need to get only integer values from the string like 498. Here I don't want to use list slicing because the integer values may increase like these examples:

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

So I want to get only integer values out from the string exactly in the same order. I mean like 498,49867,497543 from string1,string2,string3 respectively.

Can anyone let me know how to do this in a one or two lines?

0

11 Answers 11

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

If there are multiple integers in the string:

>>> list(map(int, re.findall(r'\d+', string1)))
[498]
Sign up to request clarification or add additional context in comments.

6 Comments

this is not exactly correct, yes it will do for string starting with a integer, but if the integer is in the middle of the string, it won't do. Maybe it should be better to use int(re.search(r'\d+', string1).group())
If string1 is (020) 3493, it fails.
Right it was the wrong code, should ahve used re.search
@Hussain well, the example only showed numbers at the fron though but anyway now it's safe either way
This will work fine. But, one should check if result of re.search is not None. Otherwise, it'll throw an AttributeError ('NoneType' object has no attribute 'group') if there is no digit present in the string after accessing .group().
|
64

An answer taken from ChristopheD here: https://stackoverflow.com/a/2500023/1225603

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

Comments

30

Here's your one-liner, without using any regular expressions, which can get expensive at times:

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

returns:

'123453120'

Comments

22

if you have multiple sets of numbers then this is another option

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

its no good for floating point number strings though.

Comments

10

Iterator version

>>> import re
>>> string1 = "498results should get"
>>> [int(x.group()) for x in re.finditer(r'\d+', string1)]
[498]

Comments

7
>>> import itertools
>>> int(''.join(itertools.takewhile(lambda s: s.isdigit(), string1)))

4 Comments

This will only work if the number is at the start of the string. Also, why not use str.isdigit instead of the lambda?
This could also be written as int(''.join(itertools.takewhile(str.isdigit, string1))). I would never actually use either method since this is overcomplicating it.
I'm planning ahead for the case where the strings are thousands of characters long.
5

With python 3.6, these two lines return a list (may be empty)

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

Similar to

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

Comments

1

this approach uses list comprehension, just pass the string as argument to the function and it will return a list of integers in that string.

def getIntegers(string):
        numbers = [int(x) for x in string.split() if x.isnumeric()]
        return numbers

Like this

print(getIntegers('this text contains some numbers like 3 5 and 7'))

Output

[3, 5, 7]

Comments

1
  integerstring=""
  string1 = "498results should get"
  for i in string1:
      if i.isdigit()==True 
      integerstring=integerstring+i
   print(integerstring)        

Comments

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

2 Comments

not sure why you had to do return int(final) just returning return final also works.
also can you explain what is making it bring only digits?
-1

Another option is to remove the trailing the letters using rstrip and string.ascii_lowercase (to get the letters):

import string
out = [int(s.replace(' ','').rstrip(string.ascii_lowercase)) for s in strings]

Output:

[498, 49867, 497543]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.