Python Basics — String Slicing

2 minute read

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]
  • start is inclusive, stop is exclusive
  • Omitting start defaults to 0, omitting stop defaults 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 →

Updated: