Python Strings and String Methods: The Complete Beginner's Guide
Every real program works with text — usernames, APIs, files, and logs. This chapter teaches how Python strings work: quoting, indexing, slicing, immutability, escapes, the methods you will use daily, and f-strings for professional formatting.
Chapter 4 of 20 · Beginner · 35 min · Python Programming Course
Every real program works with text. Usernames, messages, file contents, API responses, error logs, search queries — all of it is text. In Python, text is stored as a string, and strings are one of the most feature-rich data types in the language.
This chapter covers everything you need to work with strings confidently: how to create them, how to access individual characters and slices, how strings behave differently from other data types, and the 20+ built-in string methods that handle the text operations you will need in virtually every project you build.
What you will learn in this chapter
By the end of this tutorial you will be able to:
- Create strings using single quotes, double quotes, and triple quotes
- Access individual characters using indexing
- Extract substrings using slicing
- Understand why strings are immutable and what that means practically
- Use escape characters for special formatting
- Apply 20+ string methods including
split(),join(),replace(),strip(),find(), and more - Format strings professionally using f-strings
- Concatenate and repeat strings
- Avoid the most common string mistakes beginners make
Estimated time: 35 minutes reading + 20 minutes practice
Creating strings in Python
A string is a sequence of characters enclosed in quotes. Python accepts three quoting styles — each has a specific use case.
Single and double quotes
Both work identically for simple strings. Choose based on what is inside the string:
name = "Schoolabe"
language = 'Python'
greeting = "Hello, World!"
print(name) # Schoolabe
print(language) # Python
print(greeting) # Hello, World!
Use double quotes when your string contains an apostrophe:
message = "It's a great day to learn Python"
print(message) # It's a great day to learn Python
Use single quotes when your string contains double quotes:
quote = 'She said "Python is powerful"'
print(quote) # She said "Python is powerful"
Mixing them without a reason is just inconsistency. Pick a style and stick with it across a project.
Triple quotes — multiline strings
Triple quotes (either """ or ''') let you write strings that span multiple lines. The line breaks are preserved exactly as written:
description = """Python is a high-level programming language.
It is known for its clean syntax and readability.
First released in 1991, it is now one of the most popular languages."""
print(description)
Output:
Python is a high-level programming language.
It is known for its clean syntax and readability.
First released in 1991, it is now one of the most popular languages.
Triple quotes are also used for docstrings — the documentation strings you write at the top of functions and classes to explain what they do. You will see this convention throughout professional Python code.
def greet(name):
"""Returns a personalised greeting for the given name."""
return f"Hello, {name}!"
String indexing — accessing individual characters
A string is a sequence — an ordered collection of characters. Every character has a position number called an index, starting at 0.
language = "Python"
# P y t h o n
# 0 1 2 3 4 5
Access any character using square brackets with its index:
language = "Python"
print(language[0]) # P — first character
print(language[1]) # y
print(language[3]) # h
print(language[5]) # n — last character
Negative indexing — counting from the end
Python also supports negative indexes, which count backward from the end of the string. -1 is the last character, -2 is second to last, and so on:
language = "Python"
# P y t h o n
# -6 -5 -4 -3 -2 -1
print(language[-1]) # n — last character
print(language[-2]) # o
print(language[-6]) # P — first character
Negative indexing is particularly useful when you need the last part of a string without knowing its length:
filename = "report_2026.pdf"
print(filename[-3:]) # pdf — last 3 characters
Index out of range
Accessing an index that does not exist raises an IndexError:
language = "Python" # length is 6, valid indexes are 0 to 5
# print(language[6]) # IndexError: string index out of range
# print(language[10]) # IndexError: string index out of range
When you see this error, check two things: the length of your string and the index you are using.
String slicing — extracting substrings
Slicing extracts a portion of a string. The syntax is string[start:end] where start is included and end is excluded:
language = "Python Programming"
# 0123456789...
print(language[0:6]) # Python — characters at index 0,1,2,3,4,5
print(language[7:18]) # Programming
print(language[0:1]) # P — single character via slice
Slice shortcuts
language = "Python Programming"
print(language[:6]) # Python — start defaults to 0
print(language[7:]) # Programming — end defaults to string length
print(language[:]) # Python Programming — entire string
Step in slicing — string[start:end:step]
The third parameter controls how many characters to skip between each included character:
text = "Python"
print(text[::2]) # Pto — every second character
print(text[::1]) # Python — every character (default)
print(text[::-1]) # nohtyP — reverse the string
Reversing a string with [::-1] is a Python classic that appears frequently in coding interviews. Remember it.
word = "racecar"
print(word[::-1]) # racecar
print(word == word[::-1]) # True — it's a palindrome
Strings are immutable
This is the most important behavioural difference between strings and lists. Once a string is created, you cannot change individual characters in it. Strings are immutable.
name = "Python"
# name[0] = "J" # TypeError: 'str' object does not support item assignment
This is not a bug — it is a deliberate design choice. Immutability makes strings safer and more predictable in programs where the same string might be referenced in multiple places.
The practical implication: when you "modify" a string, you are actually creating a new string:
name = "Python"
name = name.replace("P", "J") # creates a NEW string "Jython"
print(name) # Jython
Every string method that appears to modify a string is actually returning a new string. The original is untouched. This is why you must assign the result back to a variable — calling a method without capturing the return value does nothing useful:
text = " hello "
text.strip() # does nothing useful — result is discarded
text = text.strip() # correct — captures the new string
print(text) # hello
Escape characters — special characters in strings
Some characters cannot be typed directly into a string. Escape characters let you include them using a backslash.
# Newline — moves to the next line
print("Line 1\nLine 2\nLine 3")
# Tab — adds horizontal spacing
print("Name:\tAlex")
print("City:\tDelhi")
# Backslash — includes a literal backslash
print("File path: C:\\Users\\Alex\\Documents")
# Apostrophe — use double quotes, or escape inside single quotes
print("It's working")
print('She said \"Hello\"')
Raw strings — disable escape processing: when you need a string with lots of backslashes (file paths on Windows, regular expressions), prefix the string with r:
# Without raw string — backslashes need escaping
path = "C:\\Users\\Alex\\Documents\\file.txt"
# With raw string — cleaner
path = r"C:\Users\Alex\Documents\file.txt"
print(path)
String operations — concatenation and repetition
Concatenation — joining strings with +
first = "Python"
second = "Programming"
result = first + " " + second
print(result) # Python Programming
The + operator only works between strings. Combining a string with a number raises a TypeError:
age = 25
# print("Age: " + age) # TypeError
print("Age: " + str(age)) # Age: 25 — convert first
print(f"Age: {age}") # Age: 25 — f-string is cleaner
Repetition — repeating strings with *
separator = "-" * 30
print(separator) # ------------------------------
word = "Python! "
print(word * 3) # Python! Python! Python!
Getting the length with len()
name = "Schoolabe"
print(len(name)) # 9
sentence = "Learn Python the right way"
print(len(sentence)) # 26 — includes spaces
len() counts every character including spaces, punctuation, and newlines. It is one of the most frequently used functions when working with strings.
The 20 string methods you will actually use
Python strings have dozens of built-in methods. These are the ones that appear constantly in real code.
Case methods
text = "python programming"
print(text.upper()) # PYTHON PROGRAMMING
print(text.lower()) # python programming
print(text.title()) # Python Programming
print(text.capitalize()) # Python programming
print(text.swapcase()) # PYTHON PROGRAMMING → python programming
Real use case: normalising user input before comparison. Never compare raw user input directly — always normalise case first:
user_input = "PYTHON"
if user_input.lower() == "python":
print("Correct language") # Works regardless of how user typed it
Whitespace methods
text = " hello world "
print(text.strip()) # "hello world" — removes both ends
print(text.lstrip()) # "hello world " — removes left only
print(text.rstrip()) # " hello world" — removes right only
strip() is essential when handling user input or reading data from files — both sources commonly include unwanted leading and trailing spaces.
Search methods
text = "Python is powerful and Python is popular"
print(text.find("Python")) # 0
print(text.find("Python", 1)) # 27 — search starting from index 1
print(text.find("Java")) # -1 — not found
print(text.index("Python")) # 0
# print(text.index("Java")) # ValueError: substring not found
print(text.count("Python")) # 2
print(text.count("p")) # 2 — case sensitive
print(text.startswith("Python")) # True
print(text.endswith("popular")) # True
print(text.endswith("powerful")) # False
find() vs index(): use find() when the substring might not exist and you want to handle that with an if check. Use index() when you are certain the substring exists and want an immediate error if it does not.
Replace and remove patterns
text = "Python is simple and Python is readable"
print(text.replace("Python", "JavaScript"))
print(text.replace("Python", "Go", 1))
print(text.replace("simple and ", ""))
Split and join — the most important string methods
split() converts a string into a list:
sentence = "Python is easy to learn"
words = sentence.split()
print(words)
csv_line = "Alice,25,Delhi,Engineer"
fields = csv_line.split(",")
print(fields)
print(sentence.split(" ", 2))
join() converts a list back into a string:
words = ['Python', 'is', 'easy', 'to', 'learn']
sentence = " ".join(words)
print(sentence)
csv = ",".join(["Alice", "25", "Delhi"])
print(csv)
dashes = " - ".join(["one", "two", "three"])
print(dashes)
Together they let you transform, filter, and rebuild text cleanly:
sentence = "Python is really really great"
words = sentence.split()
filtered = [w for w in words if w != "really"]
result = " ".join(filtered)
print(result) # Python is great
Check methods — returning True or False
print("hello".isalpha())
print("hello123".isalpha())
print("12345".isdigit())
print("12.5".isdigit())
print("hello123".isalnum())
print("hello 123".isalnum())
print(" ".isspace())
print("HELLO".isupper())
print("hello".islower())
print("Hello World".istitle())
These are useful for input validation — confirming a string contains only certain kinds of characters.
Padding and alignment methods
text = "Python"
print(text.center(20))
print(text.center(20, "-"))
print(text.ljust(20, "."))
print(text.rjust(20, "."))
print("42".zfill(5))
F-strings in depth
You have used f-strings in previous chapters. Here is the full picture of what they can do:
name = "Arjun"
score = 87.5
rank = 3
print(f"Name: {name}")
print(f"Score: {score * 1.1:.1f}")
print(f"Upper: {name.upper()}")
grade = "Distinction" if score >= 75 else "Pass"
print(f"{name} achieved: {grade}")
large = 1234567.89
print(f"Formatted: {large:,.2f}")
print(f"{'Rank':<10}{'Name':<15}{'Score':>8}")
print(f"{rank:<10}{name:<15}{score:>8}")
The format spec after : inside {} controls number formatting, alignment, and decimal places. You do not need to memorise all of this now — knowing it exists means you will recognise it when you see it in real code.
A complete working program
Here is a text processing program that uses a realistic mix of string methods together:
# User profile processor
raw_input = " riya sharma "
email_input = " RIYA.SHARMA@EMAIL.COM "
bio_input = "python developer,open source contributor,mentor,blogger"
name = raw_input.strip().title()
email = email_input.strip().lower()
bio_tags = bio_input.split(",")
bio_tags = [tag.strip().title() for tag in bio_tags]
formatted_bio = " | ".join(bio_tags)
username = name.replace(" ", "_").lower()
initials = "".join([part[0].upper() for part in name.split()])
print(f"=== User Profile ===")
print(f"Name: {name}")
print(f"Username: {username}")
print(f"Initials: {initials}")
print(f"Email: {email}")
print(f"Bio: {formatted_bio}")
print(f"Name length: {len(name)} characters")
print(f"Email valid: {email.endswith('.com') and '@' in email}")
Output:
=== User Profile ===
Name: Riya Sharma
Username: riya_sharma
Initials: RS
Email: riya.sharma@email.com
Bio: Python Developer | Open Source Contributor | Mentor | Blogger
Name length: 11 characters
Email valid: True
Read through every line. Every method used here — strip(), title(), lower(), replace(), split(), join(), upper(), endswith(), in — is covered in this chapter.
Four string mistakes that catch every beginner
Mistake 1: trying to modify a string in place
name = "python"
# name[0] = "P" # TypeError
name = "P" + name[1:]
# or
name = name.capitalize()
print(name)
Mistake 2: forgetting to capture the return value
text = " hello "
text.strip()
print(text)
text = text.strip()
print(text)
Mistake 3: off-by-one errors in slicing
The end index in a slice is excluded from the result. text[0:6] gives characters at positions 0 through 5 — not 6.
Mistake 4: case-sensitive comparisons without normalising
user_city = "DELHI"
if user_city.lower() == "delhi":
print("Found")
Practice: string exercises
Exercise 1 — string analyser: Write a program that takes any sentence stored in a variable and prints: uppercase, title case, character count (including spaces), word count, and whether the sentence ends with a full stop.
Exercise 2 — username generator: Given first_name = "Riya" and last_name = "Sharma", create a username that is lowercase, combines both names with an underscore, and has no extra spaces. Check if the username contains any digits.
Exercise 3 — email validator (basic): Check whether a string stored in email contains exactly one @ symbol and ends with .com. Print Valid or Invalid.
Exercise 4 — reverse and palindrome: Reverse a string using slicing and check whether it equals the original. Test with racecar, python, and madam.
Exercise 5 — CSV parser: Given data = "Alice,28,Engineer,Delhi,Python", split into fields, print each with a label, then rejoin with |.
→ See all Python string exercises with solutions
For the full exercise hub (all topics), see Python exercises.
What comes next — Day 5: lists and list methods
Strings are sequences of characters. Lists are sequences of anything — numbers, strings, other lists, mixed types. The concepts you just learned about indexing, slicing, and built-in methods carry directly into lists, which makes Day 5 significantly easier to absorb.
Day 5 covers creating and accessing lists, list methods (append(), pop(), sort(), and more), slicing with the same syntax as strings, list comprehensions, and nested lists.
→ Continue to Day 5: Lists and List Methods
Chapter navigation
- Previous: Day 3: Operators and Expressions
- Next: Day 5: Lists and List Methods
Frequently asked questions: Strings and string methods
What is a string in Python?
A string is a sequence of characters stored as a single value. Any text enclosed in single quotes, double quotes, or triple quotes is a string in Python. Strings are one of the most commonly used data types because almost all real-world data — names, messages, file contents, API responses — arrives as text.
Are Python strings mutable or immutable?
Python strings are immutable — once created, their characters cannot be changed individually. Any operation that appears to modify a string (like replace() or upper()) actually creates and returns a new string. The original string remains unchanged. This is why you must assign the result back to a variable to keep the modified version.
What is the difference between find() and index() in Python strings?
Both locate a substring and return its starting index. The difference is in how they handle a missing substring: find() returns -1 if the substring is not found, while index() raises a ValueError. Use find() when the substring might not be present and you want to check programmatically. Use index() when you are certain it exists.
What is string slicing in Python?
String slicing extracts a portion of a string using the syntax string[start:end:step]. The start index is included, the end index is excluded, and step controls how many characters to skip. text[0:5] returns the first 5 characters. text[::-1] reverses the entire string. Slicing never modifies the original — it returns a new string.
What is the difference between split() and join() in Python?
split() breaks a string into a list of substrings based on a delimiter. join() does the reverse — it combines a list of strings into a single string using a separator. They are frequently used together: split to process parts individually, then join to reassemble the result.
What are f-strings in Python and why should I use them?
F-strings (formatted string literals) are strings prefixed with f that allow you to embed variables and expressions directly inside {} placeholders. f"Hello {name}" inserts the value of name automatically. They are the modern, preferred way to format strings in Python 3.6+ because they are more readable and faster than older methods like .format() or % formatting.
Why does Python not have a character data type?
Python treats a single character as a string of length 1. There is no separate char type like in C++ or Java. "A" is a string. "A"[0] is also a string — just a shorter one. This simplifies the language: you only need to know one type for all text, regardless of length.
Related Page
Day 3: Operators and Expressions
Learn about day 3: operators and expressions
Learn MoreDay 5: Lists and List Methods
Continue with day 5: lists and list methods
Learn MorePython exercises hub
165+ programs with solutions
Learn MorePython quiz
Multiple-choice checks with explanations
Learn MorePython string programs
String exercises with solutions
Learn More