Skip to Content
Python Cookbook
book

Python Cookbook

by Alex Martelli, David Ascher
July 2002
Intermediate to advanced
608 pages
15h 46m
English
O'Reilly Media, Inc.
Content preview from Python Cookbook

Dispatching Based on Pattern Matches

Credit: Michael Robin

Problem

You need to use regular expressions to match strings and then automatically call functions with arguments based on the matched strings.

Solution

Once again, a class offers a good way to package together some state and some behavior:

import re

class Dispatcher:

    def _dispatch(self, cmdList, str):
        """ Find a match for str in the cmdList and call the associated
           method with arguments that are the matching grouped subexpressions
           from the regex.
        """
        for comment, pattern, command in cmdList:
             found = pattern.match(str)   # or, use .search(  )
             if found: return command(self, *found.groups(  ))

    def runCommand(self, cmd):
        self._dispatch(Commands, cmd)

    # example methods

    def cmd1(self, num, name):
        print "The number for %s is %d" % (name, int(num))
        return 42

    def cmd2(self, partnum):
        print "Widget serial #: %d" % int(partnum)

Commands = [
      [ 'Number-to-name correspondence',
              r'X (?P<num>\d+),(?P<name>.*)$',
              Dispatcher.cmd1],
      [ 'Extract Widget part-number',
              r'Widget (?P<partnum>.*)$',
              Dispatcher.cmd2],
]

# Prepare the Commands list for execution by compiling each re for cmd in Commands:
    try:
     cmd[1] = re.compile( cmd[1] )
    except:
     print "Bad pattern for %s: %s" % ( cmd[0], cmd[1] )

Discussion

In Python, it’s generally best to compile regular expressions into re objects. The re module does some caching of string-form regular expressions that you use directly, but it’s still better to make sure that regular expressions are not needlessly recompiled. ...

Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.

Read now

Unlock full access

More than 5,000 organizations count on O’Reilly

AirBnbBlueOriginElectronic ArtsHomeDepotNasdaqRakutenTata Consultancy Services

QuotationMarkO’Reilly covers everything we've got, with content to help us build a world-class technology community, upgrade the capabilities and competencies of our teams, and improve overall team performance as well as their engagement.
Julian F.
Head of Cybersecurity
QuotationMarkI wanted to learn C and C++, but it didn't click for me until I picked up an O'Reilly book. When I went on the O’Reilly platform, I was astonished to find all the books there, plus live events and sandboxes so you could play around with the technology.
Addison B.
Field Engineer
QuotationMarkI’ve been on the O’Reilly platform for more than eight years. I use a couple of learning platforms, but I'm on O'Reilly more than anybody else. When you're there, you start learning. I'm never disappointed.
Amir M.
Data Platform Tech Lead
QuotationMarkI'm always learning. So when I got on to O'Reilly, I was like a kid in a candy store. There are playlists. There are answers. There's on-demand training. It's worth its weight in gold, in terms of what it allows me to do.
Mark W.
Embedded Software Engineer

You might also like

Python Workout

Python Workout

Reuven M. Lerner
Python Cookbook, 3rd Edition

Python Cookbook, 3rd Edition

David Beazley, Brian K. Jones

Publisher Resources

ISBN: 0596001673Catalog PageErrata