How to Lowercase a String in Python
What you’ll build or solve
You’ll convert text to lowercase so comparisons, lookups, and storage behave consistently.
When this approach works best
Lowercasing works well when you:
Learn Python on Mimo
- Compare user input, like matching
"Yes","YES", and"yes"to the same value. - Normalize keys for dictionaries or databases, like storing emails in one consistent form.
- Build case-insensitive search, like filtering a list of product names by a query.
Avoid lowercasing when casing matters for display or meaning, like person names, titles, passwords, or case-sensitive IDs.
Prerequisites
- Python installed
- You know what a string is
Step-by-step instructions
1) Lowercase a string with lower()
Use .lower() to convert letters to lowercase. This keeps non-letter characters unchanged.
text="Hello, WORLD! 2026"
lowered=text.lower()
print(lowered)
What to look for:
.lower() returns a new string. The original string does not change, so save the result if you need it later.
2) Use casefold() for stronger case-insensitive matching
Some characters need more than a basic lowercase conversion. .casefold() is built for comparisons across languages.
CSS
a="straße"
b="STRASSE"
print(a.lower()==b.lower())
print(a.casefold()==b.casefold())
Use this when your main goal is matching text, not showing it to a user.
What to look for:
.casefold() can change the length of the string. That is fine for matching, but it can surprise you if you rely on exact indexes later.
3) Combine with strip() for user input
User input often includes extra spaces or line breaks. Clean that first, then lowercase.
raw=" YES\n"
normalized=raw.strip().lower()
print(normalized)
What to look for:
Strip before lowercasing so hidden whitespace does not affect matching.
Examples you can copy
Example 1: Case-insensitive command handling
Bash
command=input("Type start/stop: ").strip().casefold()
ifcommand=="start":
print("Starting...")
elifcommand=="stop":
print("Stopping...")
else:
print("Unknown command.")
Example 2: Normalize emails before saving
email=" Naomi@Example.COM "
email=email.strip().casefold()
print(email)
This helps you treat "MINA@example.com" and "mina@example.com" as the same address for lookups.
Example 3: Filter a list with a case-insensitive query
items= ["Red Chair","blue table","GREEN Lamp"]
query="laMp"
q=query.casefold()
matches= [itemforiteminitemsifqinitem.casefold()]
print(matches)
Example 4: Build a frequency counter that ignores case
words= ["Python","python","PYTHON","Java"]
counts= {}
forwinwords:
key=w.casefold()
counts[key]=counts.get(key,0)+1
print(counts)
Example 5: Normalize a username, but keep it readable
Lowercase for the stored key, keep the original for display.
username_input="Alice_W"
username_key=username_input.strip().casefold()
print(username_input,username_key)
Common mistakes and how to fix them
Mistake 1: Calling lower() and expecting the original string to change
What you might do
text="HELLO"
text.lower()
print(text)
Why it breaks
Strings are immutable, so .lower() returns a new string.
Fix
text="HELLO"
text=text.lower()
print(text)
Mistake 2: Using lower() for matching and getting surprising results
What you might do
a="straße"
b="STRASSE"
print(a.lower()==b.lower())
Why it breaks
Some characters need special case rules for reliable matching.
Fix
a="straße"
b="STRASSE"
print(a.casefold()==b.casefold())
Troubleshooting
If matching still fails after lowercasing, print repr(value) to spot hidden whitespace like \n or \t, then use .strip().
If you see “duplicate” keys that look the same, normalize in one place, then reuse that result everywhere.
If your code behaves differently for non-English text, use .casefold() for comparisons instead of .lower().
If you need predictable character positions, avoid applying .casefold() after you calculate indexes. Case folding can change string length.
If you compare user input to a list of allowed values, normalize both sides the same way, then compare.
Quick recap
- Use
.lower()to convert text to lowercase. - Use
.casefold()for case-insensitive matching across languages. - Combine
.strip()with lowercasing for user input cleanup. - Normalize both sides before comparing strings.
- Keep the original text for display when casing matters.
Join 35M+ people learning for free on Mimo
4.8 out of 5 across 1M+ reviews
Check us out on Apple AppStore, Google Play Store, and Trustpilot