iterate lines with regex

Carl Banks pavlovevidence at gmail.com
Mon Aug 3 23:04:12 CEST 2009


On Aug 3, 11:44 am, Robert Kern <robert.k... at gmail.com> wrote:
> On 2009-08-03 12:29, MRAB wrote:
>
>
>
>
>
> > Robert Kern wrote:
> > [snip]
>
> >> for line in readThis:
> >> key_match = key.search(line)
> >> if key_match is not None:
> >> this_key = key_match.group(1)
> >> # ... do something with this_key
> >> map_match = map.search(line)
> >> if map_match is not None:
> >> this_map = map_match.group(1)
> >> # ... do something with this_map
> >> parcel_match = parcel.search(line)
> >> if parcel_match is not None:
> >> this_parcel = parcel_match.group(1)
> >> # ... do something with this_parcel
>
> > re.search and re.match will return a MatchObject if successful or None
> > if unsuccessful. A MatchObject is always true, so you can simplify to:
>
> > ...
> > if key_match:
> > this_key = key_match.group(1)
> > # ... do something with this_key
> > ...
>
> True, but I prefer to maintain a consistent style for None-testing regardless of
> whether or not I am sure the not-None type will have a suitable __nonzero__
> implementation.


There's one thing to keep in mind.

In the unknown future, it's possible that re.match could be changed to
return an object with a false value that contains some information
about the reason for failure, or partial match information, or
something like that.

If that happens, code like:

   if m:

will continue to work, while code like

   if m is not None:

will suddenly fail.

Granted, it's not likely to happen for regexps but it could happen in
similar situations in other places.  I am one of the biggest critics
of implicit boolean values, but given that Python has it, I think it
is best to adhere strongly idiomatic uses like regexps.


Carl Banks



More information about the Python-list mailing list