Python re.cipe

Kurt Schwer says:

Perl programmers are assumed to know regular expressions. I think python programmers should get more exposure to regular expressions.

So, this morning I needed to process a KML document, adding IDs derived from a name element to all parent Placemark elements. Python's regular expressions aren't as expressive or as built in as Perl's, but there's nothing you can't do by using a callable object as the second argument to re.sub. To convert this:

<Placemark>
  <name>B5</name>
  ...
</Placemark>

to this:

<Placemark id="b5">
  <name>B5</name>
  ...
</Placemark>

I just executed the following statements at the interpreter prompt:

>>> kmlin = open('temp.kml').read()
>>> def sub_id(m):
...     g = m.groups()
...     return '<Placemark id="%s">%s<name>%s' % (g[1].lower(), g[0], g[1])
...
>>> import re
>>> kmlout = re.sub(r'<Placemark>(\s+)<name>(\w\d)', sub_id, kmlin)
>>> f = open('grid.kml', 'w')
>>> f.write(kmlout)
>>> f.close()