Matt Wette wrote:
Over the last few years I have converted from Perl and Scheme to
Python. There one task that I do often that is really slick in Perl
but escapes me in Python. I read in a text line from a file and check
it against several regular expressions and do something once I find a match.
For example, in perl ...
if ($line =~ /struct {/) { do something } elsif ($line =~ /typedef struct {/) { do something else } elsif ($line =~ /something else/) { } ...
I am having difficulty doing this cleanly in python. Can anyone help?
rx1 = re.compile(r'struct {') rx2 = re.compile(r'typedef struct {') rx3 = re.compile(r'something else')
m = rx1.match(line) if m: do something else: m = rx2.match(line) if m: do something else: m = rx3.match(line) if m: do something else: error
If you don't need the match object as part of "do something", you could do a fairly literal translation of the Perl:
if rx1.match(line):
do something
elif rx2.match(line):
do something else
elif rx3.match(line):
do other thing
else:
raise ValueError("...")Alternatively, if each of the "do something" phrases can be easily reduced to a function call, then you could do something like:
def do_something(line, match): ... def do_something_else(line, match): ... def do_other_thing(line, match): ...
table = [ (re.compile(r'struct {'), do_something),
(re.compile(r'typedef struct {'), do_something_else),
(re.compile(r'something else'), do_other_thing) ]for pattern, func in table:
m = pattern.match(line)
if m:
func(line, m)
break
else:
raise ValueError("...")The for/else pattern may look a bit odd, but the key feature here is that the else clause only runs if the for loop terminates normally -- if you break out of the loop, the else does *not* run.
Jeff Shannon
-- http://mail.python.org/mailman/listinfo/python-list
