template strings for matching?

Peter Otten __peter__ at web.de
Thu Oct 9 15:20:48 CEST 2008


Joe Strout wrote:

> Catching up on what's new in Python since I last used it a decade ago,
> I've just been reading up on template strings.  These are pretty
> cool!  

I don't think they've gained much traction and expect them to be superseded
by PEP 3101 (see http://www.python.org/dev/peps/pep-3101/ )

> However, just as a template string has some advantages over % 
> substitution for building a string, it seems like it would have
> advantages over manually constructing a regex for string matching.
> 
> So... is there any way to use a template string for matching?  I
> expected something like:
> 
>   templ = Template("The $object in $location falls mainly in the
> $subloc.")
>   d = templ.match(s)
> 
> and then d would either by None (if s doesn't match), or a dictionary
> with values for 'object', 'location', and 'subloc'.
> 
> But I couldn't find anything like that in the docs.  Am I overlooking
> something?

I don't think so. Here's a DIY implementation:

import re

def _replace(match):
    word = match.group(2)
    if word == "$":
        return "[$]"
    return "(?P<%s>.*)" % word

def extract(template, text):
    r = re.compile(r"([$]([$]|\w+))")
    r = r.sub(_replace, template)
    return re.compile(r).match(text).groupdict()


print extract("My $$ is on the $object in $location...",
              "My $ is on the biggest bird in the highest tree...")

As always with regular expressions I may be missing some corner cases...

Peter



More information about the Python-list mailing list