Using re.search, re.match, and re.fullmatch#

So far we’ve used re.findall; re.search, re.match, and re.fullmatch are three other important functions in the re module.

All three of re.search, re.match, and re.fullmatch find a single match of a regular expression in a string. All three return a Match object, or None if the pattern doesn’t match. The function re.search will search the whole string, but re.match and re.fullmatch both start at the beginning of the string. The only difference between these last two is that the re.fullmatch function tries to match the whole string while re.match is okay with some leftover. Let’s play with it!

Notice how the two behave the same when whole string matches, but fullmatch returns None when there’s more text after the space—because the whole string didn’t match.

Match objects#

Both re.match and re.fullmatch return a Match object. The Match.__str__ method gives you some basic information about what the Match object holds: the span tells you the indices of the string that matched; the match tells you the part of the string that matched. You can get this information out using some methods, used in our show_match helper:

The m.span() method gets you the span of the string that matched: i.e., a tuple with the start and end indices of the match. The m.group() method is more interesting: takes a non-negative integer as its argument. The group 0 is the whole part of the string that matched; the group 1 is the first capturing group (from the left of the regex) that matched; group 2 is the second, and so on. Note that m.group(1) extracts the capturing group of the “identifier” part itself, ignoring the space.

The conditional in show_match—here testing for None and returning early—is a common idiom in regex processing in Python. It is perhaps more common to see if m: ..., though here it’s more concise to test the other way.