bwgoudey wrote:
I have a lot of if/elif cases based on regular expressions that I'm using to
filter stdin and using print to stdout. Often I want to print something
matched within the regular expression and the moment I've got a lot of cases
like:

...
elif re.match("^DATASET:\s*(.+) ", line):
        m=re.match("^DATASET:\s*(.+) ", line)
        print m.group(1))


which is ugly because of the duplication but I can't think of a nicer of way
of doing this that will allow for a lot of these sorts of cases. Any
suggestions?

I've done this in the past with re-to-function pairings:

  def action1(matchobj):
    print matchobj.group(1)
  def action2(matchobj):
    print matchobj.group(3)
  # ... other actions to perform

  searches = [
    (re.compile(PATTERN1), action1),
    (re.compile(PATTERN2), action2),
    # other pattern-to-action pairs
    ]

  # ...
  line = ...
  for regex, action in searches:
    m = regex.match(line)
    if m:
      action(m)
      break
  else:
    no_match(line)

(note that that's a for/else loop, not an if/else pair)

-tkc





--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to