Extract Number from String in Python

Question:

I am new to Python and I have a String, I want to extract the numbers from the string. For example:

str1 = "3158 reviews"
print (re.findall('d+', str1 ))

Output is ['4', '3']

I want to get 3158 only, as an Integer preferably, not as List.

Asked By: Umair Ayub

||

Answers:

If the format is that simple (a space separates the number from the rest) then

int(str1.split()[0])

would do it

Answered By: 6502

Your regex looks correct. Are you sure you haven’t made a mistake with the variable names? In your code above you mixup total_hotel_reviews_string and str.

>>> import re
>>> s = "3158 reviews"
>>> 
>>> print(re.findall("d+", s))
['3158']
Answered By: spaceghost

This code works fine. There is definitely some other problem:

>>> import re
>>> str1 = "3158 reviews"
>>> print (re.findall('d+', str1 ))
['3158']
Answered By: Irshad Bhat

You can filter the string by digits using str.isdigit method,

>>> int(filter(str.isdigit, str1))
3158

For Python3:

int(list(filter(str.isdigit, my_str))[0])
Answered By: Vishnu Upadhyay

There may be a little problem with code from Vishnu’s answer. If there is no digits in the string it will return ValueError. Here is my suggestion avoid this:

>>> digit = lambda x: int(filter(str.isdigit, x) or 0)
>>> digit('3158 reviews')
3158
>>> digit('reviews')
0
Answered By: M.Danilchenko

My answer does not require any additional libraries, and it’s easy to understand. But you have to notice that if there’s more than one number inside a string, my code will concatenate them together.

def search_number_string(string):
    index_list = []
    del index_list[:]
    for i, x in enumerate(string):
        if x.isdigit() == True:
            index_list.append(i)
    start = index_list[0]
    end = index_list[-1] + 1
    number = string[start:end]
    return number
Answered By: Yang Qi

To extract a single number from a string you can use re.search(), which returns the first match (or None):

>>> import re
>>> string = '3158 reviews'
>>> int(re.search(r'd+', string).group(0))
3158

In Python 3.6+ you can also index into a match object instead of using group():

>>> int(re.search(r'd+', string)[0])
3158
Answered By: Eugene Yarmash
IntVar = int("".join(filter(str.isdigit, StringVar)))
Answered By: Bernard

Above solutions seem to assume integers. Here’s a minor modification to allow decimals:

num = float("".join(filter(lambda d: str.isdigit(d) or d == '.', inputString)

(Doesn’t account for – sign, and assumes any period is properly placed in digit string, not just some english-language period lying around. It’s not built to be indestructible, but worked for my data case.)

Answered By: thund

#Use this, THIS IS FOR EXTRACTING NUMBER FROM STRING IN GENERAL.
#To get all the numeric occurences.

*split function to convert string to list and then the list comprehension
which can help us iterating through the list
and is digit function helps to get the digit out of a string.

getting number from string

use list comprehension+isdigit()

test_string = "i have four ballons for 2 kids"

print("The original string : "+ test_string)


# list comprehension + isdigit() +split()

res = [int(i) for i in test_string.split() if i.isdigit()]
print("The numbers list is : "+ str(res))

#To extract numeric values from a string in python

*Find list of all integer numbers in string separated by lower case characters using re.findall(expression,string) method.

*Convert each number in form of string into decimal number and then find max of it.

import re 
 def extractMax(input):

# get a list of all numbers separated by lower case characters
 
 numbers = re.findall('d+',input) 

# d+ is a regular expression which means one or more digit

number = map(int,numbers)
print max(numbers)
if __name__=="__main__":
input = 'sting'
extractMax(input)
Answered By: Ayush Singh
a = []
line = "abcd 3455 ijkl 56.78 ij"
for word in line.split():
 try:
  a.append(float(word))
  except ValueError:
  pass
print(a)

OUTPUT

3455.0 56.78
Answered By: Ayush Singh

I am a beginner in coding. This is my attempt to answer the questions. Used Python3.7 version without importing any libraries.

This code extracts and returns a decimal number from a string made of sets of characters separated by blanks (words).

Attention: In case there are more than one number, it returns the last value.

line = input ('Please enter your string ')
for word in line.split():
    try:
        a=float(word)
        print (a)
    except ValueError:
        pass

Best for every complex types

str1 = "sg-23.0 300sdf343fc  -34rrf-3.4r" #All kinds of occurrence of numbers between strings
num = [float(s) for s in re.findall(r'-?d+.?d*', str1)]
print(num)

Output:

[-23.0, 300.0, 343.0, -34.0, -3.4]
Answered By: user13959036

you can use the below method to extract all numbers from a string.

def extract_numbers_from_string(string):
    number = ''
    for i in string:
        try:
            number += str(int(i))
        except:
            pass
    return number

(OR) you could use i.isdigit() or i.isnumeric(in Python 3.6.5 or above)

def extract_numbers_from_string(string):
    number = ''
    for i in string:
        if i.isnumeric():
            number += str(int(i))
    return number


a = '343fdfd3'
print (extract_numbers_from_string(a))
# 3433
Answered By: SuperNova

For python3

input_str = '21ddd3322'
int(''.join(filter(str.isdigit, input_str)))

> 213322
Answered By: Binh Ho

You were quite close to the final answer. Your re.finadall expression was only missing the enclosing parenthesis to catch all detected numbers:

re.findall( ‘(d+)’, str1 )

For a more general string like str1 = "3158 reviews, 432 users", this code would yield:

Output: [‘3158’, ‘432’]

Now to obtain integers, you can map the int function to convert strings into integers:

A = list(map(int,re.findall(‘(d+)’,str1)))

Alternatively, you can use this one-liner loop:

A = [ int(x) for x in re.findall(‘(d+)’,str1) ]

Both methods are equally correct. They yield A = [3158, 432].

Your final result for the original question would be first entry in the array A, so we arrive at any of these expressions:

result = list(map(int,re.findall( ‘(d+)’ , str1 )))[0]

result = int(re.findall( ‘(d+)’ , str1 )[0])

Even if there is only one number present in str1, re.findall will still return a list, so you need to retrieve the first element A[0] manually.

Answered By: C-3PO

Python 2.7:

>>> str1 = "3158 reviews"
>>> int(filter(str.isdigit, str1))
3158

Python 3:

>>> str1 = "3158 reviews"
>>> int(''.join(filter(str.isdigit, str1)))
3158
Answered By: darkstar

Using a list comprehension and Python 3:

>>> int("".join([c for c in str1 if str.isdigit(c)]))
3158
Answered By: ross
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.