Python Basics — String Slicing
String Slicing
Slicing extracts a portion of a string. It’s one of Python’s most elegant features.
Slice Notation
string[start:stop:step]
- start — beginning index (inclusive, default: 0)
- stop — ending index (exclusive, default: end of string)
- step — how many characters to skip (default: 1)
Basic Slicing
text = "Hello, World!"
print(text[0:5]) # Hello
print(text[7:12]) # World
print(text[7:]) # World!
print(text[:5]) # Hello
print(text[:]) # Hello, World! (full copy)
Visual Guide
H e l l o , W o r l d !
0 1 2 3 4 5 6 7 8 9 10 11 12
text[0:5] → "Hello" (index 0,1,2,3,4)
text[7:12] → "World" (index 7,8,9,10,11)
text[7:] → "World!" (index 7 to end)
text[:5] → "Hello" (start to index 4)
Negative Indexing in Slices
text = "Hello, World!"
print(text[-6:]) # orld! (last 6 characters)
print(text[-6:-1]) # orld (last 6, excluding last 1)
print(text[:-1]) # Hello, World (everything except last char)
Step Parameter
text = "Hello, World!"
print(text[::2]) # Hlo ol! (every 2nd character)
print(text[::3]) # Hl r! (every 3rd character)
print(text[1::2]) # el,Wrd (starting at 1, every 2nd)
Reversing Strings
text = "Hello"
reversed_text = text[::-1]
print(reversed_text) # olleH
# Palindrome check
word = "racecar"
is_palindrome = word == word[::-1]
print(f"'{word}' is palindrome: {is_palindrome}") # True
Extracting Substrings
# First N characters
text = "Python Programming"
print(text[:6]) # Python
# Last N characters
print(text[-11:]) # Programming
# Middle portion
print(text[7:18]) # Programming
# Every other character
print(text[::2]) # Pto rgamn
Practical: Parsing a Date String
date = "2025-03-15"
year = date[:4]
month = date[5:7]
day = date[8:10]
print(f"Year: {year}, Month: {month}, Day: {day}")
Output:
Year: 2025, Month: 03, Day: 15
Slice Objects
You can save a slice pattern and reuse it:
first_four = slice(0, 4)
last_four = slice(-4, None)
words = ["Python", "Hello", "World", "Testing"]
for word in words:
print(f"{word}: first 4 = '{word[first_four]}', last 4 = '{word[last_four]}'")
Output:
Python: first 4 = 'Pyth', last 4 = 'thon'
Hello: first 4 = 'Hell', last 4 = 'ello'
World: first 4 = 'Worl', last 4 = 'orld'
Testing: first 4 = 'Test', last 4 = 'ting'
Out-of-Bounds Slicing
Unlike indexing, slicing never raises an error — it just returns what’s available:
text = "Hi"
print(text[0:100]) # Hi (no error)
print(text[50:100]) # "" (empty string, no error)
print(text[-100:2]) # Hi (clipped to valid range)
Common Slicing Patterns
| Pattern | Result | Description |
|---|---|---|
s[:] |
Full copy | Copy entire string |
s[:n] |
First n chars | "Hello"[:3] → "Hel" |
s[n:] |
From n to end | "Hello"[2:] → "llo" |
s[-n:] |
Last n chars | "Hello"[-2:] → "lo" |
s[:-n] |
All except last n | "Hello"[:-2] → "Hel" |
s[::-1] |
Reversed | "Hello"[::-1] → "olleH" |
s[::2] |
Every 2nd char | "Hello"[::2] → "Hlo" |
Summary
- Slice syntax:
string[start:stop:step] startis inclusive,stopis exclusive- Omitting
startdefaults to 0, omittingstopdefaults to end - Negative indices count from the end
[::-1]reverses a string- Slicing never raises an
IndexError— it silently clips to valid bounds - Use
slice()objects to create reusable slice patterns
Next up: String Methods →