# How to Extract Numbers from a String

## Problem Formulation and Solution Overview

In this article, you’ll learn how to extract numbers from a string in Python.

To make it more fun, we have the following running scenario:

This article references an Albanian proverb written by Driton Selmani in 2012. We will leave the interpretation up to you.

π¬ Question: How would we write Python code to extract numbers from a String?

We can accomplish this task by one of the following options:

## Preparation

Add the following code to the top of each code snippet. This snippet will allow the code in this article to run error-free.

`import re`

## Method 1: Use List Comprehension and isdigit()

You can use `List Comprehension` and `isdigit()` to extract, convert and return a list of positive numbers found in a string `txt` using the expression `[int(s) for s in txt.split() if s.isdigit()]` that returns a List of Integers.

Here’s an example:

```txt  = "One can't hold 2 watermelons in 1 hand: by Driton Selmani, 2012"
nums =  [int(s) for s in txt.split() if s.isdigit()]
print(nums)```

This code creates the variable `txt` that holds the proverb indicated above.

Next, `List Comprehension` evaluates each string element. If the element contains a number, this element is extracted (`txt.split()`), converted to an integer (`int(s)`) and appended to `nums`. Once all elements have been evaluated, the contents of `nums` is output to the terminal.

Output – a List of Integers

## Method 2: Use List Comprehension and join()

Another Pythonic way is to use a ternary expression, `List Comprehension` and `join()` to extract, convert, and return a list of positive numbers found in a string. This method returns a List of Integers.

```txt  = "One can't hold 2 watermelons in 1 hand: by Driton Selmani, 2012"
tmp  = ''.join(c if c in '0123456789' else ' ' for ch in txt)
nums = [int(i) for i in tmp.split()]
print(nums)```

This code creates the variable `txt` that holds the proverb indicated above.

Next, `join()` (an iterable) evaluates each string element.

• If an element is found in the sub-string (`'0123456789'`), the element is then concatenated to `tmp` as is.
• If not, the element is replaced with a space (`' '`) character and concatenated to `tmp`.

If the contents of `tmp` was output to the terminal at this point, it would display as follows with all other non-number elements converted to spaces.

Interim Output

Then, `List Comprehension` is used to navigate through the contents of `tmp`, converting each element to an integer (`int()`) and appending it to `nums` (effectively removing spaces).

The contents of `nums` is output to the terminal as a List of Integers.

Output – a List of Integers

Also, you may want to recap the basics of the ternary operator because it’s used in the first highlighted line in the above code snippet:

## Method 3: Use Regex

In this example, `Regex` is used to extract all positive numbers from a string. This method returns a List of Strings.

```txt  = "One can't hold 2 watermelons in 1 hand: by Driton Selmani, 2012"
nums = re.findall(r'\b\d+\b', txt)
print(nums)```

β­A Finxter Favorite!

This code creates the variable `txt` that holds the proverb indicated above.

Next, a regex (`re.findall()`) is used to create and extract all positive numbers from the string passed as a parameter.

In short, the `\d+` notation lets `Regex` know to search the string for all occurrences of one (1) or more digits and extract them. The result of this extraction saves to nums as a List of Strings.

Output – a List of Strings

## Method 4: Use a For Loop

This example uses a `For` loop to traverse the string elements, checking for the existence of a positive number (`c.isdigit()`). If found, it is converted to an integer and appended to nums. This method returns a List of Integers.

```txt  = "One can't hold 2 watermelons in 1 hand: by Driton Selmani, 2012"
nums = []

for c in txt.split():
if c.isdigit():
nums.append(int(c))
print(nums)```

This code creates the variable `txt` that holds the proverb indicated above. and `nums`, a list that will contain all the numbers found in the string.

Next, a `For` loop is instantiated to traverse through each string element, checking for the existence of a number. If found, the element is converted to an integer(`int(c)`) and appended to `nums`.

The result of this extraction saves to nums as a List of Integers.

Output – a List of Integers

## Bonus: Extract Positive or Negative Numbers

What happens if you need to extract negative and positive numbers? The above examples won’t give you the results you need. But, using `regex.compile()` and `regex.findall()` will!

```txt  = "The 3rd equation resulted in -745.093."
regex = re.compile(r'[\+\-]?[0-9]+')
nums = [int(k) for k in regex.findall(txt)]
print(nums)```

This code creates a string, `txt` containing a positive and negative number.

Next, the `re.compile()` method is called. This method returns a regular expression object from the pattern passed. In this case, we have told the method to extract all negative or positive numbers (`[+-]?[0-9]+`).

This object saves to `regex`.

A List Comprehension is used to loop and search for the occurrences of any positive or negative numbers, converting them to an integer (`int(k)`), and appending to `nums`. The result of this extraction saves to nums as a List of Integers.

Output – a List of Integers

## Summary

These five (5) methods of extracting numbers from a string should give you enough information to select the best one for your coding requirements.

Good Luck & Happy Coding!