Using re.search() and re.match() for Single Matches
Raw strings (r'...') are mandatory for regex patterns because they prevent Python from interpreting backslashes as escape sequences, allowing the regex engine to receive the correct pattern.
Why the Pattern Has Two Interpreters
A regular expression pattern containing a backslash passes through two stages. First, Python interprets the string that contains the pattern. Then the regular expression engine interprets the resulting pattern. A raw string, written with the r prefix, prevents Python from interpreting backslashes as ordinary string escape sequences before the pattern reaches the regular expression engine.
Reading the \S+ Pattern
\S matches one non-whitespace character. The plus sign means one or more, so \S+ matches one or more consecutive non-whitespace characters. The match continues until whitespace or the end of the string.
SendIn this example, re.search() finds a single match. Because the pattern is \S+, the first matching run is the first word, Send. The pattern does not consume the following space, so it stops at that boundary.
What do you think happens?
What substring does re.search(r'\S+', r' blue sky') find?
Reveal answer
Answer: blue
The pattern requires a non-whitespace character. The scan can pass the leading spaces, then \S+ consumes blue and stops at the space before sky.
Choosing the Starting Position
The distinction between re.match() and re.search() is where matching is allowed to begin. re.match() tests the beginning of the string. re.search() can scan forward through the string and find the first substring that matches the pattern. This difference matters when the desired text is not at position zero.
import re text = r"Status: ready" first_attempt = re.match(r"ready", text) second_attempt = re.search(r"ready", text) print(first_attempt) print(second_attempt.group())
Use re.match() when the pattern is expected at the beginning of the string. Use re.search() when the matching substring may occur later. In either case, check whether a match exists before calling a method such as group().
Collecting Email-Like Substrings
The pattern \S+@\S+ combines three ideas. The first \S+ requires at least one non-whitespace character before the @ symbol. The @ must appear literally between the two parts. The second \S+ requires at least one non-whitespace character after the @ symbol. This extracts email-like substrings from surrounding text.
Extracting Addresses from a Message
Find every substring matching \S+@\S+ in the text: Contact a@sample.org or b@sample.net for help.
Build the pattern: Use the raw string pattern r'\S+@\S+'. It requires non-whitespace text before and after @.
Scan the input: re.findall() scans from left to right and records each matching substring.
Check the result: The returned list contains both email-like substrings, so it is not empty.
['a@sample.org', 'b@sample.net']
['a@sample.org', 'b@sample.net']When a Match Disappears
A missing match can result from different stages of the process. Python may not pass the intended backslash pattern to the regular expression engine. The pattern may require characters that the input does not contain. Or the selected method may be checking a different starting position than you expected.
Writing a backslash pattern as an ordinary string instead of a raw string
Python interprets backslashes in regular strings before the regular expression engine receives the pattern, which can create a mismatch between the intended pattern and the pattern actually used.
Fix:
Use re.findall(r"\S+@\S+", text).Expecting \S+ to cross whitespace
\S+ stops when it encounters whitespace.
Fix:
Predict each consecutive non-whitespace run separately.Using re.match() when the target appears later
The target is not at the beginning of the string.
Fix:
Use re.search() when the matching substring may occur later.Indexing an empty findall result
No matches produce an empty list, so an index may not exist.
Fix:
Check that the returned list is not empty before accessing an element.Assuming every human-looking email is accepted by \S+@\S+
The pattern requires at least one non-whitespace character on both sides of @.
Fix:
Check both required \S+ portions when debugging a missing match.
Guided Practice
For each input, predict the result before running the code. Identify the substring found by re.search(r'\S+', input), then decide whether re.match(r'code', input) and re.search(r'code', input) can find code.
Hints
- Ignore leading whitespace when reasoning about re.search(r'\S+', input).
- Remember that \S+ stops at whitespace.
- Compare the beginning of the input with the location of code.
- For a findall task, check whether the input has at least one non-whitespace character before and after @.
- Use raw strings such as r'\S+' so Python preserves the backslash for the regular expression engine.
- \S matches one non-whitespace character, while \S+ consumes a consecutive non-whitespace run.
- re.match() checks the beginning of a string, while re.search() can find the first matching substring later in the string.
- re.findall() scans from left to right and returns a list containing every matching substring.
- Check for an empty result before indexing a findall list, and verify that both sides of \S+@\S+ contain non-whitespace characters.
Key Takeaways
- Raw strings preserve backslashes so regular expression patterns reach the regex engine as intended.
- \S+ matches one or more consecutive non-whitespace characters and stops at whitespace or the end of the string.
- Use re.match() for a pattern at the beginning and re.search() for a matching substring that may occur later.
- Use re.findall() to collect every matching substring, and check that its returned list is not empty before indexing it.
- When a match is missing, inspect the string form, the pattern requirements, and the choice between match and search.