template strings for matching?
Peter Otten
__peter__ at web.de
Thu Oct 9 09:20:48 EDT 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