Fundamentals 4 min read

Mastering Greedy vs. Non‑Greedy Regex in Python: A Hands‑On Guide

This article explains the difference between greedy and non‑greedy patterns in Python regular expressions, demonstrates their behavior with practical code examples, shows how to capture HTML tags, and introduces named group techniques, helping readers master regex matching nuances.

Python Crawling & Data Mining
Python Crawling & Data Mining
Python Crawling & Data Mining
Mastering Greedy vs. Non‑Greedy Regex in Python: A Hands‑On Guide

Introduction

A fan asked about the difference between greedy and non‑greedy modes in Python regular expressions, sparking a lively discussion. This article shares the question and provides a detailed answer.

Solution Process

The answer includes a sample code that demonstrates both greedy and non‑greedy matching.

import re

txt = "This is an HTML tag: <head>HEADER</head>. It means the head of the whole HTML document."
pattern1 = re.compile(r"<.*>")
pattern2 = re.compile(r"<.*?>")
result1 = re.findall(pattern1, txt)
result2 = re.findall(pattern2, txt)
print(result1)
print(result2)

The output is shown below.

The two patterns differ only by a ? character, but the effect is significant. The greedy pattern <.*> matches the longest possible string, while the non‑greedy pattern <.*?> stops at the first closing bracket.

pattern1 = re.compile(r"<.*>")
pattern2 = re.compile(r"<.*?>")

Visual analysis of the results is illustrated below.

The greedy mode continues matching until the last possible closing tag, whereas the non‑greedy mode stops at the first closing tag.

Bonus

A bonus example shows how to use named groups to capture tag names.

import re

txt = "This is an HTML tag: <head>HEADER</head>. It means the head of the whole HTML document."

tag = re.compile(r"<(?P<tag_mark>[A-Za-z0-9]+)>.*?</(?P=tag_mark)>.*")
print(re.findall(tag, txt))

Conclusion

The article answers the fan’s question by clearly explaining greedy vs. non‑greedy regex behavior, providing code samples, output screenshots, and a named‑group technique, thereby helping readers solve similar regex challenges.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

regular expressionsnon-greedyNamed Groupsgreedy
Python Crawling & Data Mining
Written by

Python Crawling & Data Mining

Life's short, I code in Python. This channel shares Python web crawling, data mining, analysis, processing, visualization, automated testing, DevOps, big data, AI, cloud computing, machine learning tools, resources, news, technical articles, tutorial videos and learning materials. Join us!

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.