The str.isalnum() method returns True if all characters in the string are alphanumeric (either alphabetic letters or numeric digits) and the string contains at least one character. It returns False if the string is empty or contains spaces, underscores, punctuation, or special symbols.
Full Unicode Compliance: isalnum() recognizes global Unicode alphabets (including accented Latin characters, Cyrillic, Greek, and Chinese) and numeric scripts (such as subscripts, Roman numerals, and Devanagari digits), making it far more capable than standard ASCII regex ranges like [a-zA-Z0-9].
The isalnum() method is a built-in string method and takes no parameters:
is_alphanumeric = string.isalnum()
| Parameter | Type | Description |
|---|---|---|
| None | — | The method takes zero arguments. Passing arguments raises TypeError. |
| Return Value | bool |
Returns True if all characters are alphanumeric and length > 0; otherwise False. |
A string evaluates to True if it contains only letters, only numbers, or a mixture of both. Any whitespace or symbol immediately triggers False:
# Valid alphanumeric strings (return True)
print("plus2net".isalnum()) # True (letters only)
print("Python311".isalnum()) # True (letters + numbers)
print("2026".isalnum()) # True (digits only)
# Common triggers that return False
print("plus 2net".isalnum()) # False: space is not alphanumeric
print("user_name".isalnum()) # False: underscore is NOT alphanumeric
print("item-10".isalnum()) # False: hyphen is not alphanumeric
print("user@email".isalnum()) # False: symbol @
print("3.14".isalnum()) # False: decimal dot is punctuation
print("".isalnum()) # False: empty string is always False
Output:
True
True
True
False
False
False
False
False
False
\w (which typically matches [a-zA-Z0-9_]), Python's str.isalnum() treats the underscore (_) as punctuation. "user_1".isalnum() is strictly False.
Python 3 strings are fully Unicode compliant. Any character classified under Unicode General Categories L* (Letter) or N* (Number) satisfies isalnum():
# Accented Latin characters
print("Café101".isalnum()) # True (é is a letter)
print("München".isalnum()) # True (ü is a letter)
# Non-Latin writing systems
print("Москва2026".isalnum()) # True (Cyrillic)
print("Αθήνα".isalnum()) # True (Greek)
print("日本語".isalnum()) # True (Japanese Kanji/Kana)
print("१२३".isalnum()) # True (Devanagari digits 123)
print("x²".isalnum()) # True (superscript 2 is numeric)
Output:
True
True
True
True
True
True
True
Mn (Mark, nonspacing) rather than L (Letter). Consequently, words containing explicit combining characters (like 'नमस्ते') evaluate to False under isalnum() because the combining diacritic is not categorized as an independent letter or number.
Selecting the right string validation method is crucial for data integrity and input sanitization:
| Sample String | isalnum() |
isalpha() |
isdigit() |
isidentifier() |
|---|---|---|---|---|
"hello" | True | True | False | True |
"hello123" | True | False | False | True |
"123" | True | False | True | False (starts with digit) |
"hello_world" | False (has _) | False | False | True |
"_var1" | False | False | False | True |
"hello world" | False (space) | False | False | False |
"" (empty) | False | False | False | False |
You can use isalnum() with list comprehensions or filter() to clean user inputs, strip punctuation, or build URL slugs:
# Strip non-alphanumeric noise from a messy string
raw_input = "Order #9842-A (Express Delivery!)"
clean_alphanumeric = "".join(ch for ch in raw_input if ch.isalnum())
print("Cleaned token:", clean_alphanumeric)
# Keep spaces while dropping special symbols
clean_words = "".join(ch for ch in raw_input if ch.isalnum() or ch.isspace())
print("Words & numbers only:", clean_words)
Output:
Cleaned token: Order9842AExpressDelivery
Words & numbers only: Order 9842A Express Delivery
Many web services enforce alphanumeric account handles without symbols or spaces to prevent SQL injection and URL encoding issues:
def validate_username(username, min_len=4, max_len=16):
if not (min_len <= len(username) <= max_len):
return False, f"Username length must be between {min_len} and {max_len}."
if not username.isalnum():
return False, "Username must contain only letters and numbers (no symbols or spaces)."
return True, "Valid username."
print(validate_username("dev_user"))
print(validate_username("Alex2026"))
Output:
(False, 'Username must contain only letters and numbers (no symbols or spaces).')
(True, 'Valid username.')
Vehicle Identification Numbers (VINs) are exactly 17 characters and must be strictly alphanumeric (excluding letters I, O, and Q):
def is_valid_vin_syntax(vin):
vin = vin.strip().upper()
if len(vin) != 17:
return False
if not vin.isalnum():
return False
# VIN standard excludes letters I, O, Q to prevent confusion with 1 and 0
return not any(ch in "IOQ" for ch in vin)
print("Valid VIN: ", is_valid_vin_syntax("1HGCR2F83HA001234"))
print("Invalid VIN:", is_valid_vin_syntax("1HGCR2F83HA-01234"))
Output:
Valid VIN: True
Invalid VIN: False
The following production script implements an account validation suite and product serial sanitizer with self-checking assertions:
class AccountValidator:
def __init__(self, min_len=4, max_len=15):
self.min_len = min_len
self.max_len = max_len
def is_valid_handle(self, handle):
# Must be within bounds and strictly alphanumeric
if not isinstance(handle, str):
return False
if not (self.min_len <= len(handle) <= self.max_len):
return False
return handle.isalnum()
def sanitize_serial(self, raw_serial):
# Strips all punctuation and returns uppercase alphanumeric core
if not isinstance(raw_serial, str):
return ""
return "".join(ch.upper() for ch in raw_serial if ch.isalnum())
# --- Unit Assertions and Verification ---
validator = AccountValidator(min_len=4, max_len=12)
# 1. Handle validation tests
assert validator.is_valid_handle("Alex2026") is True
assert validator.is_valid_handle("Dev_10") is False # Underscore forbidden
assert validator.is_valid_handle("Sam 24") is False # Space forbidden
assert validator.is_valid_handle("Bob") is False # Too short (< 4)
assert validator.is_valid_handle("VeryLongUsernameIndeed") is False # Too long (> 12)
assert validator.is_valid_handle("") is False # Empty string
# 2. International Unicode alphanumeric handles
assert validator.is_valid_handle("München99") is True
assert validator.is_valid_handle("Токио20") is True
# 3. Serial number sanitizer tests
assert validator.sanitize_serial("SN-8942-X10/US") == "SN8942X10US"
assert validator.sanitize_serial("### 99-AB-cd ###") == "99ABCD"
print("Handle 'Alex2026' valid:", validator.is_valid_handle("Alex2026"))
print("Sanitized serial: ", validator.sanitize_serial("SN-8942-X10/US"))
print("All str.isalnum() unit assertions passed successfully!")
Open in Google Colab View on GitHub
Run all alphanumeric string inspections interactively, test Unicode language support, sanitize noisy text strings, and execute account handle validators in Google Colab.
Author & Instructor at plus2net
I write and maintain practical tutorials on Python, PHP, SQL, JavaScript, HTML, jQuery, and web development at plus2net. The tutorials focus on clear explanations, working examples, and code that readers can test and adapt while learning.