Python - How To Check a String Contains a Number in Python

ID : 23

viewed : 305

Tags : PythonPython String

vote vote

97

This article introduces how to check whether a Python string contains a number or not.

Python built-in together with str.isdigit will return True if the given string contains a number in it; otherwise, it returns False.

Python regular expression search method with pattern r'\d' could also return True if the given string contains a number.

Python any Function With str.isdigit to Check Whether a String Contains a Number

any function returns True if any element of the given iterable is True; otherwise, it returns False.

str.isdigit() returns True if all the characters in the given string are digits, False otherwise.

any(chr.isdigit() for chr in stringExample) 

If stringExample contains at least a number, then the above code returns True because chr.isdigit() for chr in stringExample has at least one True in the iterable.

  • Working Example
str1 = "python1" str2 = "nonumber" str3 = "12345"  print(any(chr.isdigit() for chr in str1)) print(any(chr.isdigit() for chr in str2)) print(any(chr.isdigit() for chr in str3)) 

Output:

True False True 

Use the map() Function to Check Whether a String Contains a Number

Python applies function to every element of the given iterable and returns an iterator that yields the above result.

Therefore, we could rewrite the above solution to,

any(map(str.isdigit, stringExample)) 
  • Working Example
str1 = "python1" str2 = "nonumber" str3 = "12345"  print(any(map(str.isdigit, str1))) print(any(map(str.isdigit, str2))) print(any(map(str.isdigit, str3))) 

Output:

True False True 

Use re.search(r'\d') to Check Whether a String Contains a Number

scans the string and returns the match object for the first location that matches the given pattern - \d that means any number between 0 and 9 and returns None if no match is found.

import re  print(re.search(r'\d', "python3.8")) #output: <re.Match object; span=(6, 7), match='3'> 

The match object contains the 2-tuple span that indicates the start and end position of the match and the matched content like match = '3'.

bool() function could cast the re.search result from the match object or None to True or False.

  • Working Example
import re  str1 = "python12" str2 = "nonumber" str3 = "12345"  print(bool(re.search(r'\d', str1))) print(bool(re.search(r'\d', str2))) print(bool(re.search(r'\d', str3))) 

Output:

True False True 

In terms of runtime, regular expression evaluation is much faster than using built-in string functions. If the string’s value is considerably large, then re.search() is more optimal than using the string functions.

Compiling the expression using re.compile() before running the search() function on the given strings will also make the execution time even faster.

Catch the return value of compile() into a variable and call the search() function within that variable. In this case, search() will only need a single parameter, that is, the string to search against the compiled expression.

def hasNumber(stringVal):     re_numbers = re.compile('\d')     return False if (re_numbers.search(stringVal) == None) else True 

In summary, the built-in functions any() and the isdigit() can easily be used in tandem to check if a string contains a number.

However, using the utility functions search() and compile() within the regular expression module re will generate results faster than the built-in string functions. So if you’re dealing with large values or strings, then the regular expression solution is much more optimal than the string functions.

  • Related HOW TO?