The str.islower() method returns True if all cased characters in the string are lowercase and the string contains at least one cased character. It returns False if any uppercase character is present, if the string consists entirely of uncased characters (digits, symbols, spaces), or if the string is empty.
Uncased Character Transparency: Digits, punctuation marks, whitespace, and uncased international scripts (such as Chinese or Arabic) are ignored during case evaluation. For example, "hello_world_100!".islower() is True, whereas "100!".islower() is False because it contains no cased letters.
The islower() method requires zero arguments and evaluates string contents directly:
is_all_lowercase = string.islower()
| Parameter | Type | Description |
|---|---|---|
| None | — | Takes zero arguments. Passing parameters raises TypeError. |
| Return Value | bool |
Returns True if all cased letters are lowercase and at least one cased character exists; otherwise False. |
When evaluating case, Python ignores all digits, spaces, and punctuation symbols. If all letters that possess casing are lowercase, the string evaluates to True:
# Standard lowercase strings
print("welcome to python".islower()) # True
print("python_3.14".islower()) # True (digits, dot, and underscore ignored)
print("hello world!".islower()) # True (spaces and punctuation ignored)
print("user@domain.com".islower()) # True
# Strings containing any uppercase characters return False
print("Welcome to python".islower()) # False: 'W' is uppercase
print("PYTHON".islower()) # False
print("helloWorld".islower()) # False: 'W' is uppercase (camelCase)
Output:
True
True
True
True
False
False
False
To evaluate to True, a string must contain at least one cased letter. Strings containing only numbers, punctuation, spaces, or empty strings evaluate to False:
# Strings without any cased letters evaluate to False
print("12345".islower()) # False: digits have no case
print("---".islower()) # False: symbols have no case
print(" ".islower()) # False: whitespace has no case
print("".islower()) # False: empty string
# Adding a single lowercase letter satisfies the requirement
print("12345a".islower()) # True
Output:
False
False
False
False
True
isupper(), Python requires at least one character that can actually change case. This ensures that non-textual data like phone numbers, numeric IDs, or timestamps are not misidentified as lowercase text.
Python 3 supports Unicode lowercase categories (Ll) across world alphabets, including Latin extensions, Greek, Cyrillic, and the German sharp S:
# European accented letters and German sharp S (\u00df)
print("café".islower()) # True (é is lowercase)
print("münchen".islower()) # True (ü is lowercase)
print("straße".islower()) # True (ß is lowercase)
# Cyrillic and Greek lowercase text
print("москва".islower()) # True (Cyrillic lowercase)
print("αθήνα".islower()) # True (Greek lowercase)
# Uncased scripts (Chinese, Arabic, Hebrew) have no case distinction
print("中文".islower()) # False: no cased letters
print("python 中文".islower()) # True: cased letters are lower; Chinese is ignored
Output:
True
True
True
True
True
False
True
The table below summarizes how Python evaluates case states across common string representations:
| String | islower() |
isupper() |
istitle() |
str.lower() Matches? |
|---|---|---|---|---|
"hello world" | True | False | False | True |
"Hello World" | False | False | True | False |
"HELLO WORLD" | False | True | False | False |
"123 hello" | True | False | False | True |
"123" (digits) | False | False | False | True (unchanged) |
"" (empty) | False | False | False | True |
When implementing user authentication rules requiring at least one lowercase character, calling password.islower() is a classic bug because it demands that all letters be lowercase:
# INCORRECT password check:
bad_check = "SecurePass123!".islower()
print("password.islower():", bad_check) # False: requires ALL letters to be lower!
# CORRECT password check:
good_check = any(c.islower() for c in "SecurePass123!")
print("Contains lowercase:", good_check) # True
Output:
password.islower(): False
Contains lowercase: True
Modern web frameworks and SEO best practices require URL slugs to be strictly lowercase with hyphens or underscores to avoid duplicate content penalties and 404 redirects on Linux servers:
def is_valid_url_slug(slug):
slug = slug.strip()
if not slug:
return False
# Must be lowercase and composed only of letters, numbers, and hyphens
return slug.islower() and all(c.isalnum() or c == "-" for c in slug)
print("Valid slug: ", is_valid_url_slug("python-string-methods-2026")) # True
print("Invalid slug:", is_valid_url_slug("Python-String-Methods-2026")) # False (uppercase)
Output:
Valid slug: True
Invalid slug: False
PEP 8 specifies that Python module names should have short, all-lowercase names, with underscores allowed if it improves readability:
def is_pep8_module_name(module_name):
return module_name.isidentifier() and module_name.islower()
print("requests valid: ", is_pep8_module_name("requests")) # True
print("urllib_parse valid: ", is_pep8_module_name("urllib_parse")) # True
print("MyModule invalid: ", is_pep8_module_name("MyModule")) # False (CamelCase)
Output:
requests valid: True
urllib_parse valid: True
MyModule invalid: False
The following production script implements an SEO URL slug validator, a PEP 8 module linter, and a password lowercase compliance auditor with automated assertions:
class NamingAndSecurityAuditor:
@staticmethod
def is_clean_url_slug(slug):
# Validates clean SEO slugs: lowercase, non-empty, only alphanumeric and hyphens
if not isinstance(slug, str) or not slug:
return False
return slug.islower() and all(c.isalnum() or c == '-' for c in slug)
@staticmethod
def audit_password_lowercase(password):
# Checks whether password contains at least one lowercase letter
if not isinstance(password, str):
return False, "Invalid input type."
if not any(c.islower() for c in password):
return False, "Password must include at least one lowercase character."
return True, "Valid lowercase compliance."
# --- Unit Assertions and Verification ---
auditor = NamingAndSecurityAuditor()
# 1. URL slug validation tests
assert auditor.is_clean_url_slug("python-islower-guide") is True
assert auditor.is_clean_url_slug("release-v3-14") is True
assert auditor.is_clean_url_slug("Python-Guide") is False # Uppercase rejected
assert auditor.is_clean_url_slug("python_guide") is False # Underscore rejected in strict slug
assert auditor.is_clean_url_slug("123-456") is False # Pure digits lack cased letters
assert auditor.is_clean_url_slug("") is False
# 2. Password lowercase policy tests
assert auditor.audit_password_lowercase("ADMIN_123") == (False, "Password must include at least one lowercase character.")
assert auditor.audit_password_lowercase("Admin_123") == (True, "Valid lowercase compliance.")
assert auditor.audit_password_lowercase("admin_123") == (True, "Valid lowercase compliance.")
print("Slug 'python-islower-guide' valid:", auditor.is_clean_url_slug("python-islower-guide"))
print("Password audit outcome: ", auditor.audit_password_lowercase("Admin_123"))
print("All str.islower() unit assertions passed successfully!")
Open in Google Colab View on GitHub
Run all lowercase inspection examples interactively, evaluate Unicode casing, test password policy audits, and validate web URL slugs 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.