π Regular Expressions (Regex)
Regex (Regular Expression) is a pattern used to search, match, and manipulate text.
Python provides the re module for working with Regex.
import reπΉ Basic Example
Find whether a word exists in a string:
import re
text = "I love Python"
result = re.search("Python", text)
print(result)If "Python" is found, re.search() returns a match object.
π§© Common Regex Patterns
Pattern | Meaning | Example |
|---|---|---|
| Any character |
|
| Starts with |
|
| Ends with |
|
| 0 or more |
|
| 1 or more |
|
| 0 or 1 |
|
| Digit |
|
| Non-digit |
|
| Word character |
|
| Non-word character |
|
| Whitespace | space |
| Non-whitespace |
|
| Any of a, b, c |
|
| Any digit |
|
π οΈ Common re Functions
re.search() # Find first match
re.match() # Match at the beginning
re.findall() # Find all matches
re.sub() # Replace matches
re.split() # Split using a patternExample β findall()
import re
text = "I have 10 apples and 20 oranges."
numbers = re.findall(r"\d+", text)
print(numbers) #['10', '20']<div class="infographic-pyregex">
<style>
.infographic-pyregex {
--ink:#1a1a1a; --ink-soft:#5c5c5c; --paper:#fff; --paper-alt:#f0ece4;
--accent:#2563eb; --accent-soft:#e3ebfd; --line:#ddd6c9;
--err:#c0392b; --err-soft:#fbe9e7;
--mono-font:'IBM Plex Mono','SFMono-Regular',Menlo,monospace;
--display-font:'Fraunces',Georgia,serif; --body-font:'Inter',system-ui,sans-serif;
box-sizing:border-box; max-width:700px; margin:0 auto; font-family:var(--body-font); color:var(--ink); background:var(--paper);
}
.infographic-pyregex[data-theme="dark"] {
--ink:#e8e6e1; --ink-soft:#9a968c; --paper:#121212; --paper-alt:#1e1e26;
--accent:#5b8def; --accent-soft:#202942; --line:#2c313d;
--err:#e57373; --err-soft:#3a2222;
}
.infographic-pyregex *,.infographic-pyregex *::before,.infographic-pyregex *::after{box-sizing:border-box;}
.infographic-pyregex .rx-wrap{padding:0 clamp(1rem,4vw,2rem) 1.5rem;}
.infographic-pyregex h1{font-family:var(--display-font);font-weight:600;font-size:clamp(1.4rem,5vw,1.9rem);text-align:center;margin:1.5rem 0 0.25rem;letter-spacing:-0.01em;}
.infographic-pyregex .rx-sub{text-align:center;color:var(--ink-soft);font-size:0.85rem;margin:0 0 1.3rem;}
.infographic-pyregex .row{display:flex;justify-content:center;gap:0.4rem;margin-bottom:0.8rem;flex-wrap:wrap;align-items:center;}
.infographic-pyregex .row span{font-family:var(--mono-font);font-size:0.8rem;color:var(--ink-soft);}
.infographic-pyregex .row input{font-family:var(--mono-font);font-size:0.85rem;padding:0.4rem 0.6rem;border:1.5px solid var(--line);border-radius:5px;background:var(--paper-alt);color:var(--ink);}
.infographic-pyregex .row input:focus{outline:none;border-color:var(--accent);}
#patternInput{width:220px;}
#textInput{width:100%;}
.infographic-pyregex .preset-row{display:flex;flex-wrap:wrap;justify-content:center;gap:0.4rem;margin-bottom:1rem;}
.infographic-pyregex .preset-btn{font:inherit;font-family:var(--mono-font);font-size:0.72rem;font-weight:700;background:var(--paper-alt);border:1.5px dashed var(--line);color:var(--ink-soft);padding:0.28rem 0.55rem;cursor:pointer;border-radius:999px;}
.infographic-pyregex .preview-box{font-family:var(--mono-font);font-size:0.88rem;line-height:1.8;background:var(--paper-alt);border:1.5px solid var(--line);border-radius:8px;padding:0.8rem 0.9rem;margin-bottom:1rem;white-space:pre-wrap;word-break:break-word;}
.infographic-pyregex .preview-box mark{background:var(--accent-soft);color:var(--accent);border-radius:3px;padding:0 0.05em;font-weight:700;box-shadow:0 0 0 1px var(--accent);}
.infographic-pyregex .btn-row{display:flex;justify-content:center;gap:0.4rem;margin-bottom:1rem;flex-wrap:wrap;}
.infographic-pyregex .btn{font:inherit;font-family:var(--mono-font);font-size:0.8rem;font-weight:700;background:var(--accent);color:#fff;border:none;border-radius:999px;padding:0.45rem 0.9rem;cursor:pointer;}
.infographic-pyregex .btn.secondary{background:var(--paper-alt);color:var(--ink);border:1.5px solid var(--line);border-radius:6px;}
.infographic-pyregex .replace-row{display:flex;justify-content:center;gap:0.4rem;margin-bottom:0.9rem;flex-wrap:wrap;align-items:center;}
.infographic-pyregex .replace-row input{width:130px;}
.infographic-pyregex .result-box{font-family:var(--mono-font);font-size:0.85rem;text-align:center;color:var(--ink-soft);min-height:1.4em;margin-bottom:0.6rem;word-break:break-word;}
.infographic-pyregex .result-box strong{color:var(--accent);}
.infographic-pyregex .result-box.is-err{color:var(--err);}
.infographic-pyregex .rx-caption{text-align:center;font-size:0.85rem;color:var(--ink-soft);margin-top:0.6rem;}
@media (prefers-reduced-motion:reduce){.infographic-pyregex *,.infographic-pyregex *::before,.infographic-pyregex *::after{animation-duration:.001ms!important;transition-duration:.001ms!important;}}
</style>
<div class="rx-wrap">
<h1>Regex β the re module</h1>
<p class="rx-sub">Type a pattern. Every match highlights live in the text below it.</p>
<div class="row">
<span>pattern = r"</span><input id="patternInput" type="text" value="\d+" /><span>"</span>
</div>
<div class="row">
<input id="textInput" type="text" value="Order #4521 shipped, 3 items, total $89" />
</div>
<div class="preset-row">
<button class="preset-btn" data-p="\d+" data-t="Order #4521 shipped, 3 items, total $89">numbers: \d+</button>
<button class="preset-btn" data-p="[A-Za-z]+@[A-Za-z]+\.com" data-t="Contact alice@example.com or bob@test.com">email: \w+@\w+\.com</button>
<button class="preset-btn" data-p="\b\w{5,}\b" data-t="A short quick brown fox jumped nicely">5+ letter words: \b\w{5,}\b</button>
</div>
<div class="preview-box" id="previewBox"></div>
<div class="btn-row">
<button class="btn" id="searchBtn">re.search(pattern, text)</button>
<button class="btn secondary" id="findallBtn">re.findall(pattern, text)</button>
</div>
<div class="replace-row">
<span>re.sub(pattern, "</span><input id="subInput" type="text" value="#" /><span>", text)</span>
<button class="btn secondary" id="subBtn">Run</button>
</div>
<p class="result-box" id="rxResult"></p>
<p class="rx-caption">re.search finds the first match. re.findall gets every match. re.sub replaces every match.</p>
</div>
<script>
(function(){
var root = document.currentScript.closest('.infographic-pyregex') || document.querySelector('.infographic-pyregex');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark = bodyAttr === 'true' ? true : bodyAttr === 'false' ? false : (document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/) || [])[1] === 'true';
if (dark) root.setAttribute('data-theme', 'dark');
var patternInput = root.querySelector('#patternInput');
var textInput = root.querySelector('#textInput');
var previewBox = root.querySelector('#previewBox');
var resultEl = root.querySelector('#rxResult');
function escapeHtml(s) { return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); }
function buildRegex(global) {
try {
return new RegExp(patternInput.value, global ? 'g' : '');
} catch (e) {
return null;
}
}
function renderPreview() {
var text = textInput.value;
var re = buildRegex(true);
if (!re) {
previewBox.innerHTML = escapeHtml(text);
return;
}
var out = '';
var lastIndex = 0;
var m;
re.lastIndex = 0;
while ((m = re.exec(text)) !== null) {
if (m[0] === '') { re.lastIndex++; continue; }
out += escapeHtml(text.slice(lastIndex, m.index));
out += '<mark>' + escapeHtml(m[0]) + '</mark>';
lastIndex = m.index + m[0].length;
}
out += escapeHtml(text.slice(lastIndex));
previewBox.innerHTML = out;
}
patternInput.addEventListener('input', renderPreview);
textInput.addEventListener('input', renderPreview);
root.querySelectorAll('.preset-btn').forEach(function (btn) {
btn.addEventListener('click', function () {
patternInput.value = btn.dataset.p;
textInput.value = btn.dataset.t;
renderPreview();
resultEl.textContent = '';
resultEl.className = 'result-box';
});
});
root.querySelector('#searchBtn').addEventListener('click', function () {
var re = buildRegex(false);
if (!re) { resultEl.textContent = 're.error: invalid pattern'; resultEl.className = 'result-box is-err'; return; }
var m = re.exec(textInput.value);
if (m) {
resultEl.innerHTML = 're.search(...) β matched <strong>"' + escapeHtml(m[0]) + '"</strong> at position ' + m.index;
resultEl.className = 'result-box';
} else {
resultEl.textContent = 're.search(...) β None (no match found)';
resultEl.className = 'result-box is-err';
}
});
root.querySelector('#findallBtn').addEventListener('click', function () {
var re = buildRegex(true);
if (!re) { resultEl.textContent = 're.error: invalid pattern'; resultEl.className = 'result-box is-err'; return; }
var matches = textInput.value.match(re) || [];
resultEl.innerHTML = 're.findall(...) β [' + matches.map(function (m) { return '"' + escapeHtml(m) + '"'; }).join(', ') + '] (' + matches.length + ' found)';
resultEl.className = 'result-box';
});
root.querySelector('#subBtn').addEventListener('click', function () {
var re = buildRegex(true);
if (!re) { resultEl.textContent = 're.error: invalid pattern'; resultEl.className = 'result-box is-err'; return; }
var repl = root.querySelector('#subInput').value;
var result = textInput.value.replace(re, repl);
resultEl.innerHTML = 're.sub(...) β "' + escapeHtml(result) + '"';
resultEl.className = 'result-box';
});
renderPreview();
})();
</script>
</div>