[Baypiggies] Discussion for newbies/beginner night talks

Doug Landauer zia at cruzio.com
Sat Feb 10 09:42:21 CET 2007

On Feb 10, 2007, at 12:27 AM, Doug Landauer wrote:
> For what it's worth, here's my version.  It was inspired by Hal
> Fulton's "margin" method from his Ruby book.  It works at runtime, and
> isn't as strict as the cookbook example that Michael Bernstein
> mentioned (
> http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/145672 ), but
> it's short and a bit easier to use (less cluttered-looking at usage
> site) than Chad's more efficient compile-time version.
> import re
> undent_pat = re.compile( r"(?m)^\s*\S(.*)$", re.M  )
> def undent (str):
>      return undent_pat.sub( r'\1', str.rstrip() )

Always happens just *after* I post ...

I merged a couple of versions of that pattern, and now the initial (?m) 
is redundant.
Removing it makes the pattern easier to understand:

   undent_pat = re.compile( r"^\s*\S(.*)$", re.M  )

With the M (multiline) mode, ^ matches beginning of any line in the 
string, and $ matches the ends of them.

So you can use an even shorter version:

import re
def undent (str):
     return re.sub( r'(?m)^\s*\S(.*)$', r'\1', str.rstrip() )

if you don't care about the regex getting recompiled at each usage.

  -- Doug L.

More information about the Baypiggies mailing list